题目
选择一个数a 来满足条件
题解思路
先筛出范围内的所有素数,判断完不是素数后再用快速幂来遍历判断。
坑点
快速幂都要用longlong,别以为有取模就不会爆int,乘的时候照样可能爆了!。
AC代码
#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
int vis[80000];
long long kuaisumi(long long di,long long mi,long long mo)
{
long long ans=1;
while(mi)
{
if(mi & 1) //相当于mi %2==1;
{
ans=ans*di%mo;
}
di=di*di%mo;
mi >>= 1; //相当与 mi/=2;
}
return ans;
}
int main ()
{
ios::sync_with_stdio(false);
vis[1] = 1;
for (int i = 2 ; i <= 6500 ; i++ )
{
if (!vis[i])
{
for (int k = 2*i ; k <= 65000 ; k += i )
vis[k] = 1;
}
}
long long n;
while(cin>>n)
{
if ( !n )
break;
if (!vis[n])
{
cout<<n<<" is normal.\n";
continue;
}
long long i ;
for (i = 2 ; i < n ; i++ )
{
if (kuaisumi(i,n,n) != i )
break;
}
if ( i == n )
cout<<"The number "<<n<<" is a Carmichael number.\n";
else
cout<<n<<" is normal.\n";
}
return 0;
}