码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2016-07-03 19:24:49      阅读:120      评论:0      收藏:0      [点我收藏+]

标签:

传送门

正整数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 最长的循环节(数论)

标签:

原文地址:http://blog.csdn.net/qingshui23/article/details/51812047

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!