orz还是不太会啊,数论真的是……码着慢慢看……
参考资料:循环小数
欧拉函数求法与应用
题意:求解一个最小的x满足 10x=1(mod C)
#include<iostream> #include<string> using namespace std; int gcd(int a, int b) { while (a > 0) { int c = b%a; b = a; a = c; } return b; } 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 modpow(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 && modpow(10, i, p) == 1) { if (cnt < i) { cnt = i; ans = p; } break; } } } cout << ans << endl; return 0; }