返回

算法题-有限小数

现在有一个正整数n,可以证明存在若干个正整数d使得1/n在d进制下为有限小数,输出最小的d。

有限小数

题目描述

​ 现在有一个正整数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是最小的。 \]