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 Name 2130779 2010-03-28 22:49:39 Accepted 2674 C++ 0 176 watashi@Zodiac */