题目本身没有任何难度,就当作是快速幂的入门题了
好像题目数据很多,需要打表
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
ll n;
bool vis[65005];
bool d[65005];
ll Pow(ll base, ll n, ll mod) {
ll res = 1;
while(n) {
if(n & 1) res = res * base % mod;
n >>= 1;
base = base * base % mod;
}
return res;
}
void init() {
int q = (int)sqrt(650005);
for(int i = 2; i <= q; i++) {
if(vis[i]) continue;
for(int j = i * i; j <= 65005; j += i) vis[j] = 1;
}
}
int main() {
init();
for(int i = 2; i <= 65005; i++) {
int flag = 0;
if(!vis[i]) d[i] = 0;
else {
for(int k = 1; k < i; k++) {
if(Pow(k, i, i) != Pow(k, 1, i)) {
d[i] = 0;
flag = 1;
}
if(flag) break;
}
if(!flag) d[i] = 1;
}
}
while(~scanf("%I64d", &n) && n) {
if(d[n]) printf("The number %d is a Carmichael number.\n", n);
else printf("%d is normal.\n", n);
}
return 0;
}