欢迎使用CSDN-markdown编辑器

拓展欧几里德:

int extend_gcd(int a,int b,int &x,int &y){
    if (!b) { x=1; y=0; return a;}
    int ans=gcd(b,a%b,x,y);
    int t=x; x=y; y=t-(a/b)*y;
    return ans;
}
中国剩余定理(互素):`
int CRT(int a[],int m[],int n){
    int ans=0,M=1;
    for (int i=1;i<=n;++i) M*=m[i];
    for (int i=1;i<=n;++i){
        int Mi=M/m[i],x,y;
        extend_gcd(Mi,m[i],x,y);
        ans=(ans+a[i]*Mi*x)%M;
    }
    return (ans+M)%M;
}`

BGSG:`int BSGS(int a,int b,int p){
    int m,v,e=1;
    m=ceil(sqrt(p));
    v=inv(pow_mod(a,m,p),p)%p;
    map<int,int>x; x[1]=0;
    for (int i=1;i<m;++i){
        e=mul_mod(e,a,p);
        if (!x.count(e)) x[e]=i;
    }
    for (int i=0;i<=m;++i){
        if (x.count(b)) return (i*m+x[b]);
        b=mul_mod(b,v,p);
    }
    return -1;
}`

线性求逆元:inv[1]=1;
for (int i=2;i<p;++i)
inv[i]=((p-p/i)*inv[p%i])%p;
for (int i=1;i<p;++i) cout<<inv[i]<<endl;

你可能感兴趣的:(22222)