快速幂加素数筛。
我有两个错误点:
1.代码:
for(int i = 2; i < n; i++) if(power(i, n) != i){ flag = false; break; }里面break一开始没写, T了。
2.快速幂我一开始是int,WA了,然后改成long long就AC了。
#include <bits/stdc++.h> using namespace std; #define N 65001 typedef long long ll; bool pri[N]; bool ans[N]; int prm[N / 10]; void prime() { int cnt = 0; pri[2] = true; for(int i = 3; i < N; i += 2) pri[i] = true; for(int i = 2; i < N; i++){ if(pri[i]){ prm[cnt++] = i; } for(int j = 0; j < cnt && prm[j] * i < N; j++){ pri[prm[j] * i] = false; if(i % prm[j] == 0) break; } } } ll power(ll a, int n) { ll ans = 1; const int mod = n; a %= mod; while(n) { if(n & 1) ans = (ans * a) % mod; a = (a * a) % mod; n >>= 1; } return ans; } bool judge(int n) { if(pri[n]) return false; bool flag = true; for(int i = 2; i < n; i++) if(power(i, n) != i){ flag = false; break; } return flag; } int main() { int n; fill(ans, ans + N, true); prime(); for(int i = 3; i < N; i++) ans[i] = judge(i); while(scanf("%d", &n) && n) { if(ans[n]) printf("The number %d is a Carmichael number.\n", n); else printf("%d is normal.\n", n); } return 0; }