标签:
10%的数据中,1 <= N <= 50;
20%的数据中,1 <= N <= 1000;
40%的数据中,1 <= N <= 100000;
100%的数据中,1 <= G <= 1000000000,1 <= N <= 1000000000。
1 #include <iostream> 2 #include <cstdio> 3 #include <cmath> 4 #define P 999911659 5 #define ll long long 6 using namespace std; 7 ll p[4]={2,3,4679,35617}; 8 ll fac[4][40010],m[4]; 9 ll N,G; 10 ll qpow(ll a,ll b,ll c) 11 { 12 int ans=1; 13 while (b) 14 { 15 if (b&1) ans=ans*a%c; 16 a=a*a%c; 17 b>>=1; 18 } 19 return ans; 20 } 21 22 ll C(ll m,ll n,ll t) 23 { 24 if (n<m) return 0; 25 return fac[t][n]*qpow(fac[t][n-m]*fac[t][m],p[t]-2,p[t])%p[t]; 26 } 27 28 ll lucas(ll m,ll n,ll t) 29 { 30 if (m==0) return 1; 31 return C(m%p[t],n%p[t],t)*lucas(m/p[t],n/p[t],t)%p[t]; 32 } 33 34 void ex_gcd(ll a,ll b,ll &x,ll &y) 35 { 36 if (b==0) {x=1;y=0;return;} 37 ex_gcd(b,a%b,x,y); 38 int t=x; x=y; y=t-a/b*y; 39 } 40 41 ll chinese_remainer() 42 { 43 ll re=0,ree=0; 44 for (int i=0;i<4;i++) 45 { 46 ll x,y; 47 ex_gcd((P-1)/p[i],p[i],x,y); 48 ree=(x%(P-1)*((P-1)/p[i])%(P-1)+(P-1))%(P-1); 49 re+=ree*m[i]%999911658; 50 re%=999911658; 51 } 52 return re; 53 } 54 55 int main() 56 { 57 scanf("%d%d",&N,&G); 58 for (int i=0;i<4;i++) 59 { 60 fac[i][0]=1; 61 for (int j=1;j<=p[i];j++) 62 fac[i][j]=(fac[i][j-1]*j)%p[i]; 63 } 64 if (G==P) {printf("0\n");return 0;} 65 G%=P; 66 for (int i=1;i<=sqrt(N);i++) 67 { 68 if (N%i==0) 69 { 70 int t=N/i; 71 for (int j=0;j<4;j++) 72 { 73 m[j]=(m[j]+lucas(i,N,j))%p[j]; 74 if (t!=i) m[j]=(m[j]+lucas(t,N,j))%p[j]; 75 } 76 } 77 } 78 int ans=chinese_remainer(); 79 printf("%d\n",qpow(G,ans,P)); 80 return 0; 81 }
【BZOJ1951】【SDOI2010】古代猪文 Lucas定理、中国剩余定理、exgcd、费马小定理
标签:
原文地址:http://www.cnblogs.com/DMoon/p/5225185.html