题目:最长的循环节
题意:求<=n的数中,倒数循环节长度最长的那个数。
思路:我能说我没思路么。。。
参考资料:循环小数论文
直到我看到了上面的论文。简单来说就是,一个整数的倒数的循环节,就是求 10x≡1(mod n) ,很明显,如果 gcd(10,n)≠1 的话,就无解。如果存在解的话,根据欧拉公式,那么这个解 x|phi(n) ,所以直接暴力枚举 x 就好了。
#include
using namespace std;
int phi(int m) {
int ans = m;
for(int i=2; i*i<=m; i++) {
if(m%i==0) {
ans = ans / i * (i - 1);
while(m%i==0) m /= i;
}
}
if(m>1) ans = ans / m * (m - 1);
return ans;
}
int fp(int a, int n, int p) {
int r = 1;
while(n) {
if(n&1) r = r * a % p;
a = a * a % p;
n >>= 1;
}
return r;
}
int main() {
int n;
cin >> n;
int ans = 0, cnt = 0;
for(int p=7; p<=n; p++) if(__gcd(10, p) == 1) {
int phn = phi(p);
for(int i=1; i<=phn; i++) {
if(phn%i == 0 && fp(10, i, p) == 1) {
if(i>cnt) {
cnt = i;
ans = p;
}
break;
}
}
}
cout << ans << endl;
return 0;
}