标签:
正整数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
解题思路:
因为是求的 1/x 的最长循环节,所以我们可以将1扩大10^1000倍,这里面肯定就会有循环节了,而且我们只需要对 x 取余就行了。也就是求10^k%x,然后找到第一个数,再找到的时候就是循环节了。
正解应该是:
要求一个 10^x≡1(modC) 如果gcd(10,C)!=1的话,显然无解。如果存在解的话,根据欧拉公式,那么这个解 x|phi(C),所以直接暴力枚举x就好了。
My Code(水过):
#include <iostream>
#include <cstring>
using namespace std;
const int MAXN = 1e3+5;
int len[MAXN], mod[MAXN];
void Init()
{
memset(len, 0, sizeof(len));
for(int i=2; i<MAXN; i++)
{
int ans = 1000000%i, tmp = 1000000%i;
if(ans == 0)
{
len[i] = 0;
continue;
}
for(int j=0; j<MAXN; j++)
{
ans *= 10;
ans %= i;
if(ans == tmp)
{
len[i] = j+1;
break;
}
}
}
int Max = -1, k;
for(int i=2; i<MAXN; i++)
{
if(len[i] > Max)
{
Max = len[i];
k = i;
}
len[i] = k;
}
}
int main()
{
Init();
int n;
while(cin>>n)
{
cout<<len[n]<<endl;
}
return 0;
}
标签:
原文地址:http://blog.csdn.net/qingshui23/article/details/51812047