一些模板和定理(主要是数论)
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 }
$\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 }
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 }
扩展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 }
欧拉定理:若 $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}$