• 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
  • 相关阅读:
    在WIN10下搭建Robot Framework环境
    Robot Framework导入selenium2library库不成功的解决方法
    git命令大全
    Axure RP 8过期,用户名和序列号(注册码)
    MySQL用命令行快速导出数据备份
    JMeter—正则表达式提取器
    用JMeter进行接口测试
    d3-project
    bower 问题
    andriod studio
  • 原文地址:https://www.cnblogs.com/zyfzyf/p/4205795.html
Copyright © 2020-2023  润新知