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
");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 }  
View Code
原文地址:https://www.cnblogs.com/zyfzyf/p/4205795.html