1 a,m和不一定互素的時候,歐拉定理的應用 a^phi(m)%m=a^(k*phi(m) ) %m (證明用到中國剩餘定理)
2 發現A 滿足的同餘式以後 ,由於phi(m)<m ,可以設計一個遞迴函式搞定之
#include<iostream>#include<vector>#include<set>using namespace std;typedef long long inta;int p[3000];vector<int> v;void make_prime(){ for(int i=2;i<3000;i++) p[i]=0; for(int i=2;i<3000;i++) { if(p[i]==0) for(int j=i*i;j<3000;j+=i) p[j]=1; } for(int i=2;i<3000;i++) if(p[i]==0) v.push_back(i);}inta quick_mod(inta a,inta b,inta m ){ inta ans=1; while(b) { if(b&1) { ans=(ans*a)%m; b--; } b/=2; a=a*a%m; } return ans;}inta fy(inta n){ inta ans=n; set<int> s; for(int i=0;i<v.size();i++) if(n%v[i]==0) { if(s.find(v[i])==s.end()) {s.insert(v[i]); ans/=v[i]; ans*=(v[i]-1); } n/=v[i]; i--; } return ans;}inta ans(inta a,inta m){ if(m==1) return 0; else { inta temp=fy(m); return quick_mod(a,temp,m)*quick_mod(a,ans(a,temp),m); }}int main(){ make_prime(); int tag=0; int p,m;int *fac=new int [13]; fac[0]=1; fac[1]=1; fac[2]=2; fac[3]=6; fac[4]=24; fac[5]=120; fac[6]=720; fac[7]=5040; fac[8]=40320; fac[9]=362880; fac[10]=3628800; fac[11]=39916800; fac[12]=479001600; while(cin>>p>>m) { if(tag==1) cout<<endl; if(tag==0) tag=1; m=fac[m]; cout<<ans(p,m)%m<<endl; }}這裡求phi(m)的方式還是有點土
watashi大神的代碼如下:
#include <cstdio>long long f[] = {1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800, 39916800, 479001600};long long p[] = {2, 3, 5, 7, 11, 13};long long gcd(long long a, long long b) {return b == 0 ? a : gcd(b, a % b);}long long phi(long long n) {long long m = 1;for (int i = 0; n > 1; ++i) {if (n % p[i] == 0) {m *= p[i] - 1;n /= p[i];while (n % p[i] == 0) {m *= p[i];n /= p[i];}}}return m;}long long powMod(long long a, long long b, long long m) {long long c = 1 % m;while (b > 0) {if ((b & 1) != 0) {c = c * a % m;}a = a * a % m;b >>= 1;}return c;}long long gao(long long a, long long b) {if (b == 1) {return 0;} else {long long d = phi(b);return powMod(a, d + gao(a, d), b);}}int main() {bool blank = false;long long a, b;while (scanf("%lld%lld", &a, &b) != EOF) {if (blank) {puts("");} else {blank = true;}printf("%lld\n", gao(a, f[b]));}return 0;}/*Run ID Submit Time Judge Status Problem ID Language Run Time(ms) Run Memory(KB) User Name2130779 2010-03-28 22:49:39 Accepted 2674 C++ 0 176 watashi@Zodiac*/