zoukankan      html  css  js  c++  java
  • BSGS模板

     1 #include<cmath>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #define mod 600000
     6 using namespace std;
     7 int cnt;
     8 long long a,b,c;
     9 int head[600005];
    10 struct Edge{
    11     int fr;
    12     int val;
    13     int nxt;
    14     long long to;
    15 }edge[600005];
    16 void addedge(int u,long long v,int w){
    17     edge[cnt].fr=u;
    18     edge[cnt].to=v;
    19     edge[cnt].val=w;
    20     edge[cnt].nxt=head[u];
    21     head[u]=cnt++;
    22 }
    23 void init(){
    24     cnt=0;
    25     memset(head,-1,sizeof(head));
    26 }
    27 long long BSGS(long long A,long long B,long long C){
    28     init();
    29     int m=sqrt(C);
    30     long long mul1=1;
    31     long long mul2=1;
    32     for(int i=1;i<=m;i++){
    33         mul1=(mul1*A)%C;
    34         long long ad=(mul1*B)%C;
    35         if(!ad)return -1;
    36         addedge(ad%mod,ad,i);
    37     }
    38     for(int i=1;i<=m+3;i++){
    39         mul2=(mul2*mul1)%C;
    40         for(int j=head[mul2%mod];j!=-1;j=edge[j].nxt){
    41             long long v=edge[j].to;
    42             if(v==mul2)return 1ll*i*m-edge[j].val;
    43         }
    44     }
    45     return -1;
    46 }
    47 int main(){
    48     scanf("%lld%lld%lld",&c,&a,&b);
    49     long long ans=BSGS(a,b,c);
    50     if(ans==-1)printf("no solution
    ");
    51     else printf("%lld
    ",ans);
    52     return 0;
    53 }
  • 相关阅读:
    SA(后缀数组)专题总结
    LCT总结
    多项式全家桶
    fft.ntt,生成函数,各种数和各种反演
    P3939 数颜色
    P1879 [USACO06NOV]玉米田Corn Fields
    主席树模板
    P2633 Count on a tree
    P1972 [SDOI2009]HH的项链
    数论
  • 原文地址:https://www.cnblogs.com/lnxcj/p/10220309.html
Copyright © 2011-2022 走看看