51NOD 1035 最长的循环节(数论)

来源:互联网 发布:base64 json解析 编辑:程序博客网 时间:2024/05/17 22:22

传送门

正整数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;}
1 0