一些模板和定理(主要是数论)

exgcd

1 int exgcd(int a,int b,int &x,int &y){
2     if(!b){ x=1,y=0; return a;}
3     int d=exgcd(b,a%b,y,x);
4     y-=a/b*x; return d;
5 }
View Code

 

$\mu ,\varphi$ 线性筛

 1 int primes[maxn],tot,phi[maxn],mu[maxn];
 2 bool v[maxn];
 3 void Init(){
 4     mu[1]=phi[1]=1;
 5     for(int i=2;i<maxn;i++){
 6         if(!v[i]) primes[tot++]=i,mu[i]=-1,phi[i]=i-1;
 7         for(int j=0;i*primes[j]<maxn;j++){
 8             v[primes[j]*i]=true;
 9             if(i%primes[j]==0){
10                 phi[primes[j]*i]=phi[i]*primes[j];
11                 break;
12             }
13             mu[primes[j]*i]=-mu[i];
14             phi[primes[j]*i]=phi[primes[j]]*phi[i];
15         }
16     }
17 }
View Code

 

BSGS 求满足 $a^x\equiv b\pmod{p}$ 的最小非负整数 $x$($a\perp p$)

 1 int bsgs(int a,int b,int p){
 2     if(1%p==b%p) return 0;
 3     int k=sqrt(p)+1;
 4     memset(head,0,sizeof(head)); cnt=0;
 5     for(int i=0,j=b%p;i<k;i++,j=(ll)j*a%p)
 6         add(j,i);
 7     int ak=power(a,k,p);
 8     for(int i=1,j=ak;i<=k;i++,j=(ll)j*ak%p)
 9         if(ask(j)!=-1) return k*i-ask(j);
10     return -INF;
11 }
View Code

 

扩展BSGS ($a,p$ 不互质)

 1 //不断除gcd(a,p)直到互质
 2 int exbsgs(int a,int b,int p){
 3     b=(b%p+p)%p;
 4     if(1%p==b%p) return 0;
 5     int x,y,d=gcd(a,p);
 6     if(d>1){
 7         if(b%d) return -INF; //return -1 不对
 8         exgcd(a/d,p/d,x,y);
 9         return exbsgs(a,(ll)b/d*x%(p/d),p/d)+1;
10     }
11     return bsgs(a,b,p);
12 }
View Code

 

欧拉定理:若 $a\perp p$,则 $a^{\varphi(p)}\equiv 1\pmod{p}$

推论:若 $a\perp p$,则对于任意正整数 $b$,$a^b\equiv a^{b\bmod\varphi(p)}\pmod{p}$

扩展欧拉定理:$a,p$ 不互质时,若 $b>\varphi(p)$,则有 $a^b\equiv a^{b\bmod\varphi(p)+\varphi(p)}\ \pmod{p}$

posted @ 2021-02-02 19:36  iMya_nlgau  阅读(21)  评论(0编辑  收藏  举报