首页 > 代码库 > BZOJ1951: [Sdoi2010]古代猪文

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 }  
View Code

 

BZOJ1951: [Sdoi2010]古代猪文