我只用 Fermat 素性测试就过了,测了素数 2,3,5,7,11,13,17,37,把所有 long long 范围内的 卡米克尔数 全部测了一遍,发现都是 NO。
所以有没有人能够叉掉我的这份代码,或者说明它的正确性啊 /kel
一年前我还是邪教徒,那时的码风令人呕吐
#include <bits/stdc++.h>
#define int unsigned long long
using namespace std;
int t,n;
int pr[8]={2,3,5,7,11,13,17,37};
int mul(int x,int y,int p)
{
int res=0;
for (;y;y=y>>1,x=(x*2)%p)
if (y&1ll) res=(res+x)%p;
return res;
}
int quick_power(int x,int y,int p)
{
int res=1;
for (;y;y=y>>1,x=mul(x,x,p))
if (y&1ll) res=mul(res,x,p);
return res;
}
bool is_prime(int x)
{
for (int i=0;i<7;i++)
{
if (x==pr[i]) return true;
if (x%pr[i]==0ll) return false;
if (quick_power(pr[i],x,x)!=pr[i]) {return false;}
}
return true;
}
signed main()
{
cin>>t;
while (t--)
{
cin>>n;
if (is_prime(n)) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}