基准时间限制:1 秒 空间限制:131072 KB 分值: 20
难度:3级算法题
正整数k的倒数1/k,写为10进制的小数如果为无限循环小数,则存在一个循环节,求<=n的数中,倒数循环节长度最长的那个数,假如存在多个最优的答案,输出所有答案中最大的那个数。
1/6= 0.1(6) 循环节长度为1
1/7= 0.(142857) 循环节长度为6
1/9= 0.(1) 循环节长度为1
Input
输入n(10 <= n <= 1000)
Output
输出<=n的数中倒数循环节长度最长的那个数
Input示例
10
Output示例
7
思路:一个整数n的倒数的循环节,就是求x: 10^x≡1(mod n)
需要特殊处理的是,分母含2或5的因数。如1235。可以先将2或5的因数提出来:
1/235=1/(5*47)=(2/47)*(1/10)
1/235和2/47的循环位数一样多。而2/47和1/47的循环位数一样多。
Code:
#include<iostream>
using namespace std;
const int MAX_N=1005;
int n,ans;
int a[MAX_N];
//一个整数n的倒数的循环节,就是求x: 10^x≡1(mod n)
int main()
{
ios::sync_with_stdio(false);
for(int i=1;i<=MAX_N;++i)
{
int k=i;
while(k%2==0){
k/=2;
}
while(k%5==0){
k/=5;
}
for(int j=1,p=10%k;j<=i;p=(p*10)%k,++j)
if(p==1){
a[i]=j; break;
}
}
while(cin>>n){
int ans=0,Max=0;
for(int i=1;i<=n;++i)
if(a[i]>Max){
Max=a[i]; ans=i;
}
cout<<ans<<endl;
}
return 0;
}