3641(Pseudoprime numbers )偽素數判定(快速冪+素數判定)
阿新 • • 發佈:2019-01-23
題目大意
給定兩個數p和a,判斷p是否是一個偽素數。
兩個條件:
①p不是一個素數;
②a^p≡a(mod p)。
附AC程式碼:
#include<bits/stdc++.h> typedef unsigned long long int ll; using namespace std; bool isprim(ll x) { if(x==1) return 0; else if(x==2) return 1; for(ll i=2; i*i<=x; i++) { if(x%i==0) return 0; } return 1; } ll quick_pow(ll a,ll b,ll mod) { ll ans=1; while(b>0) { if(b%2) ans=(ans%mod)*(a%mod); a=(a*a)%mod; b/=2; } return ans%mod; } int main() { ll p,a; while(scanf("%llu%lld",&p,&a)&&(a*p)) { if(isprim(p)) { printf("no\n"); } else { if(quick_pow(a,p,p)!=a) printf("no\n"); else printf("yes\n"); } } return 0; }