• EXGSBS模板


    EXBSGS模板

    我之前把有一处b和c弄反了,有点困...然后调了半天

    (exbsgs比excrt简单多了)

    a^{x}=c(mod\, \, b)x的最小正整数解

    原式子拆成a^{i*m-j}=c(mod ; b)

    在bsgs中,保证a,b互质,这样求出a^{j}(mod;b)的逆元挪过去才对

    但exbsgs中并不保证,所以必须不断取gcd(a,b)保证a,c互质

    p=frac{1}{prod_{k=1}^{n}gcd(k)}n为不断求gcd的总次数

    接下来式子变成了这样

    a^n/p cdot a^{x-n}=c/p(mod\, \, b/p)

    由于左边肯定和c互质,所以那部分直接挪右面求逆元再更新一下答案就行了

    剩下的a^{x-n}按BSGS思想移项,得a^{i*m}=ccdot a^{j}(mod;b)

    然后每次预处理a^{i*m}(mod;b)存进hash表/map,再在哈希表里找是否存在某一个值等于ccdot a^j(mod;b),找到了说明成立

     1 struct Hsh{
     2 #define maxn 400000
     3 int head[N1],to[M1],nxt[M1],val[M1],cte;
     4 void ins(int x,int w)
     5 {
     6     int u=x%maxn,j,v;
     7     for(j=head[u];j;j=nxt[j])
     8     {
     9         v=to[j];
    10         if(v==x) return;
    11     }
    12     cte++; to[cte]=x; nxt[cte]=head[u];
    13     head[u]=cte; val[cte]=w;
    14 }
    15 int find(int x)
    16 {
    17     int u=x%maxn,j,v;
    18     for(j=head[u];j;j=nxt[j])
    19     {
    20         v=to[j];
    21         if(v==x) return val[j];
    22     }
    23     return -1;
    24 }
    25 #undef maxn
    26 }h;
    27 
    28 int que[100],tl;
    29 int solve()
    30 {
    31     int g,i,sq;ll pw,ans=inf,now,tmp;
    32     if(A%B==0) return -1;
    33     A%=B; C%=B; tl=0;
    34     while(1)
    35     {
    36         g=gcd(A,B);
    37         if(g==1) break;
    38         if(C%g!=0) return -1;
    39         B/=g,C/=g; que[++tl]=A/g;
    40     }
    41     ll inv,invy;
    42     for(i=1;i<=tl;i++)
    43     {
    44         exgcd(que[i],B,inv,invy); inv=(inv%B+B)%B;
    45         C=inv*C%B;
    46     }
    47     if(C==1) return tl;
    48     sq=sqrt(B);
    49     for(pw=qpow(A,sq,B),now=1,i=1;(i-1)*sq<B;i++)
    50     {
    51         now=now*pw%B;
    52         h.ins(now,i);
    53     }
    54     for(now=C,i=0;i<sq;i++)
    55     {
    56         tmp=h.find(now);
    57         if(tmp!=-1) ans=min(ans,tmp*sq-i);
    58         now=now*A%B;
    59     }
    60     memset(&h,0,sizeof(h));
    61     if(ans==inf) return -1;
    62     return ans+tl;
    63 }
    64 
    65 int main()
    66 {
    67     int ans;
    68     while(scanf("%d%d%d",&A,&B,&C)&&A!=0){
    69         ans=solve();
    70         if(ans==-1) puts("No Solution");
    71         else printf("%d
    ",ans);
    72     }
    73     return 0;
    74 }
  • 相关阅读:
    《花好月圆夜》
    关于Url重写
    三大WEB服务器对比分析(apache ,lighttpd,nginx)
    APC 和 Memcache 有什么区别,哪个更好效率更高?
    URL优化不仅仅是静态化重写URL
    php中的静态变量和动态变量的区别框架加载变量时运用
    msicuu.exe (msizap.exe),程序的作用
    显示器接口针脚定义(Dsub15)
    图文教程:DIY全屏开机LOGO详解
    ASP.NET中的媒体播放
  • 原文地址:https://www.cnblogs.com/guapisolo/p/9773936.html
Copyright © 2020-2023  润新知