有限小数
题目描述
现在有一个正整数n,可以证明存在若干个正整数d使得1/n在d进制下为有限小数,输出最小的d。
输入
单组输入 第一行一个正整数\(n(2\le n\le 10^{12})\)
输出
一个正整数d
样例
输入 | 输出 |
---|---|
9 | 3 |
999 | 111 |
AC代码
#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;
int main(){
long long n;
cin>>n;
long long ans=1;
long long tmp=n;
//求n的质因数的乘积
for(long long i=2;i*i<=tmp;i++){
if(tmp%i==0){
ans*=i;
while(tmp%i==0){
tmp/=i;
}
}
}
if(tmp>1) ans*=tmp;
cout<<ans<<endl;
return 0;
}
正确性证明
若\(1/n\)可以在d进制表达为有限小数,那么一定有:
\[\frac{1}{n}=\frac{a_1}{d}+\frac{a_2}{d^2}+\dots+\frac{a_m}{d^m} \]
其中\(a_i< d(1\le i\le m)\),且\(a\)为正整数,\(m\)是一个正整数。将两边同乘\(nd^m\)得:
$$ d^m=n(a_1d^{m-1}+\dots+a_md^0)
\[ 故只要$d^m$是n的倍数,$1/n$在d进制下就为有限小数。 将n进行质因数分解,由唯一分解定理知只能分解为一种形式,设d为n的质因数的乘积,易知此时总存在m使得n|$d^m$,并且显然,这个d是最小的。 \]