题意:给你一个数,让你判断是否是非素数,同时a^n%n==a (其中 a 的范围为 2~n-1)
思路:先判断是不是非素数,然后利用快速幂对每个a进行判断
代码:
#include <iostream> #include <cmath> #include <cstdio> #include <algorithm> #define ll long long using namespace std; bool isprime(ll num) { if(num==1) return false; for(int i=2;i<=sqrt(num);i++) { if(num%i==0) { return false; } } return true; } ll qmod(ll a,ll b) { ll mod=b; ll ans=1; while(b) { if(b%2) { ans=(ans*a)%mod; } b=b/2; a=(a*a)%mod; } return ans; } int main() { ll n; while(cin>>n&&n) { if(isprime(n)==true) { cout<<n<<" is normal."<<endl; continue; } int flag=1; for(int i=2;i<=n-1;i++) { if(i!=qmod(i,n)) { flag=0; break; } } if(flag) { printf("The number %d is a Carmichael number. ",n); } else { cout<<n<<" is normal."<<endl; } } return 0; }