BZOJ1951: [Sdoi2010]古代猪文
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1951
题意:
题解:我们发现模数是个质数,所以我们只需要求出指数 mod 999911659-1 的结果即可。
这是个合数=2*3*4679*35617 所以我们就可以分开来做然后CRT合并。
分开直接lucas即可。
代码:
1 #include<cstdio> 2 3 #include<cstdlib> 4 5 #include<cmath> 6 7 #include<cstring> 8 9 #include<algorithm> 10 11 #include<iostream> 12 13 #include<vector> 14 15 #include<map> 16 17 #include<set> 18 19 #include<queue> 20 21 #include<string> 22 23 #define inf 1000000000 24 25 #define maxn 200000+5 26 27 #define maxm 200000+5 28 29 #define eps 1e-10 30 31 #define ll long long 32 33 #define pa pair<int,int> 34 35 #define for0(i,n) for(int i=0;i<=(n);i++) 36 37 #define for1(i,n) for(int i=1;i<=(n);i++) 38 39 #define for2(i,x,y) for(int i=(x);i<=(y);i++) 40 41 #define for3(i,x,y) for(int i=(x);i>=(y);i--) 42 43 #define for4(i,x) for(int i=head[x],y=e[i].go;i;i=e[i].next,y=e[i].go) 44 45 #define for5(n,m) for(int i=1;i<=n;i++)for(int j=1;j<=m;j++) 46 47 using namespace std; 48 49 inline int read() 50 51 { 52 53 int x=0,f=1;char ch=getchar(); 54 55 while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} 56 57 while(ch>='0'&&ch<='9'){x=10*x+ch-'0';ch=getchar();} 58 59 return x*f; 60 61 } 62 const int p[5]={2,3,4679,35617,999911658}; 63 int n,m,fac[maxn],inv[maxn]; 64 inline ll power(ll x,ll y,ll p) 65 { 66 ll t=1; 67 for(;y;y>>=1,x=x*x%p) 68 if(y&1)t=t*x%p; 69 return t; 70 } 71 inline void exgcd(ll a,ll b,ll &x,ll &y) 72 { 73 if(!b){x=1;y=0;return;} 74 exgcd(b,a%b,x,y); 75 int t=x;x=y;y=t-a/b*y; 76 } 77 inline ll invinv(ll a,ll b) 78 { 79 ll x,y; 80 exgcd(a,b,x,y); 81 return (x%b+b)%b; 82 } 83 inline int c(int n,int m,int p) 84 { 85 if(n<m)return 0; 86 if(n<p&&m<p)return fac[n]*inv[m]%p*inv[n-m]%p; 87 return c(n/p,m/p,p)*c(n%p,m%p,p)%p; 88 } 89 90 int main() 91 92 { 93 94 freopen("input.txt","r",stdin); 95 96 freopen("output.txt","w",stdout); 97 98 n=read();m=read();ll ans=0; 99 m%=p[4]+1; 100 if(!m){printf("0\n");return 0;} 101 for0(i,3) 102 { 103 fac[0]=1; 104 for1(j,p[i]-1)fac[j]=fac[j-1]*j%p[i]; 105 inv[0]=inv[1]=1; 106 for2(j,2,p[i]-1)inv[j]=(p[i]/j+1)*inv[j-p[i]%j]%p[i]; 107 for2(j,2,p[i]-1)inv[j]=inv[j]*inv[j-1]%p[i]; 108 ll t1=0,t2=invinv(p[4]/p[i],p[i]); 109 for(int j=1;j*j<=n;j++)if(n%j==0) 110 { 111 (t1+=c(n,j,p[i]))%=p[i]; 112 if(j*j==n)continue; 113 (t1+=c(n,n/j,p[i]))%=p[i]; 114 } 115 (ans+=(ll)p[4]/p[i]%p[4]*t2%p[4]*t1%p[4])%=p[4]; 116 } 117 (ans+=p[4])%=p[4]; 118 cout<<power(m,ans,p[4]+1)<<endl; 119 120 return 0; 121 122 }