• 【BZOJ】【2242】【SDOI2011】计算器


    快速幂/扩展欧几里得/BSGS

      经典好例题!!

      三个问题三种算法……

      算法:白书(算法竞赛入门经典——训练指南)全有……

     1 /**************************************************************
     2     Problem: 2242
     3     User: Tunix
     4     Language: C++
     5     Result: Accepted
     6     Time:1824 ms
     7     Memory:2476 kb
     8 ****************************************************************/
     9  
    10 //BZOJ 2242
    11 #include<map>
    12 #include<cmath>
    13 #include<cstdio>
    14 #include<cstdlib>
    15 #include<cstring>
    16 #include<iostream>
    17 #include<algorithm>
    18 #define rep(i,n) for(int i=0;i<n;++i)
    19 #define F(i,j,n) for(int i=j;i<=n;++i)
    20 #define D(i,j,n) for(int i=j;i>=n;--i)
    21 using namespace std;
    22  
    23 int getint(){
    24     int v=0,sign=1; char ch=getchar();
    25     while(ch<'0'||ch>'9') {if (ch=='-') sign=-1; ch=getchar();}
    26     while(ch>='0'&&ch<='9') {v=v*10+ch-'0'; ch=getchar();}
    27     return v*=sign;
    28 }
    29 /*******************tamplate********************/
    30 typedef long long LL;
    31 LL x,y,z,P;
    32 LL pow(LL a,LL b,LL P){
    33     LL r=1,base=a;
    34     while(b){
    35         if (b&1) r=r*base%P;
    36         base=base*base%P;
    37         b>>=1;
    38     }
    39     return r;
    40 }
    41 void exgcd(LL a,LL b,LL &d,LL &x,LL &y){
    42     if (!b) {d=a; x=1; y=0; return;}
    43     else{exgcd(b,a%b,d,y,x); y-=x*(a/b);}
    44 }
    45 LL log_mod(LL a,LL b,LL P){
    46     LL m,v,e=1,i;
    47     m=ceil(sqrt(P+0.5));//这里需要用ceil……?
    48     v=pow(a,P-m-1,P);//inv
    49     map<LL,LL> x;
    50     x[1]=0;
    51     for(int i=1;i<m;++i){
    52         e=e*a%P;
    53         if (!x.count(e)) x[e]=i;
    54     }
    55     rep(i,m){
    56         if (x.count(b)) return (LL)i*m+x[b];
    57         b=b*v%P;
    58     }
    59     return -1;
    60 }
    61 int main(){
    62     int T=getint(),K=getint();
    63     while(T--){
    64         y=getint(); z=getint(); P=getint();
    65         if (K==1) printf("%lld
    ",pow(y,z,P));
    66         if (K==2){
    67             LL d=0,X=0,Y=0;
    68             exgcd(y,P,d,X,Y);
    69             if(z%d){ printf("Orz, I cannot find x!
    "); continue; }
    70             X*=z/d;
    71             LL T=X*d/P;
    72             X-=T*P/d;
    73             if (X<0) X+=P/d;
    74             printf("%lld
    ",X);
    75         }
    76         if (K==3){
    77             y%=P; z%=P;
    78             if(!y && !z) {printf("1
    "); continue;}
    79             if(!y) { printf("Orz, I cannot find x!
    "); continue; }
    80             LL ans=log_mod(y,z,P);
    81             if (ans==-1){ printf("Orz, I cannot find x!
    "); continue; }
    82             printf("%lld
    ",ans);
    83         }
    84     }
    85     return 0;
    86 }
    View Code
  • 相关阅读:
    angularjs 每隔5秒重新加载一次数据
    博客已搬家
    Essential 安装备忘录
    安卓手机添加系统证书方法
    Linux 中的硬链接和符号链接
    最适合练习英语听力的15个网站
    Linux 中的文件权限
    EROFS vs F2FS vs Btrfs vs reiserFS vs EXT4 性能比对
    宇宙六种生命形态,碳基生命排第三,排名第一的硅基生命多可怕?
    什么是爬虫脑
  • 原文地址:https://www.cnblogs.com/Tunix/p/4276189.html
Copyright © 2020-2023  润新知