51nod 1035 最长的循环节

来源:互联网 发布:ubuntu 查看当前路径 编辑:程序博客网 时间:2024/06/01 21:21

这里写图片描述
做题之前先看论文:http://web.math.sinica.edu.tw/math_media/d253/25311.pdf
在论文中(二)那里讲的求循环节位数,拿来直接用就搞定了

http://blog.csdn.net/acmore_xiong/article/details/53841575我看这个写的也挺详细。

#include <bits/stdc++.h>using namespace std;const int MAXN = 1010;int res[MAXN];int mod_pow(int a, int b, int m){    int res = 1;    while(b)    {        if(b&1) res = res*a%m;        a = a*a%m;        b >>= 1;    }    return res;}int calc(int num){    while(num%2 == 0) num/=2;    while(num%5 == 0) num/=5;    if(num == 1) return 1;    int i = 1;    while(mod_pow(10,i,num) != 1) i++;    return i;}void init(){    int temp;    int maxn = 0;    for(int i = 1; i < MAXN; ++i)    {        temp = calc(i);        if(temp > maxn)        {            maxn = temp;            res[i] = i;        }        else            res[i] = res[i-1];    }}int main(){    init();    int n;    cin >> n;    cout << res[n] <<endl;    return 0;}
原创粉丝点击