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

Posted ITAK

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了51NOD 1035 最长的循环节(数论)相关的知识,希望对你有一定的参考价值。

传送门

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

以上是关于51NOD 1035 最长的循环节(数论)的主要内容,如果未能解决你的问题,请参考以下文章

51nod 1035:最长的循环节

51nod - 1035 最长的循环节

AC日记——计算循环节长度 51nod 1035

51nod1035(数论)

51Node 1035----最长的循环节

51Nod 最长的循环节(打表预处理)