gcd
gcd(a,b)=gcd(b,a mod b)
终止条件:当b=0时,gcd(a,b)=a
Exgcd
Exgcd(a,b)
ax+by=gcd(a,b)=gcd(b,a mod b)
当a与b互质时,有ax+by=gcd(a,b)=1
此时终止条件:当b=0时,a=1,x1=1,y1=0
x=y2
y=x-[a/b]*y2
void exgcd(int a,int b){
if(!b){
x=1;y=0;
return;
}
exgcd(b,a%b);
k=x;
x=y;
y=k-a/b*y;
return;
}
同余方程
求解ax=1(mod b)
转化为ax+by=1
求最小正整数解时,x=(x+b)%b
逆元
模意义下类似于倒数
a*inv[a]=1(mod p) (inv[a]<p)
性质 一定存在一个逆元且只有一个逆元
求逆元
①费马小定理
a^(p-1)=1(mod p)
那么有a*a^(p-2)=1(mod p)
inv[i]= a^(p-2) mod p
②拓展欧几里得
③线性递推
inv[i]=(p-p/i)*inv[p%i]%p
欧拉筛法
void eulerchoose(int n){
int cnt=0;
vis[1]=1;
for(int i=2;i<=n;i++){
if(!vis[i])pri[++cnt]=i;
for(int j=1;j<=cnt;j++){
if(i*pri[j]>=n)break;
vis[i*pri[j]]=true;
if(i%pri[j]==0)break;
}
}
}
快速幂
int f(int x,int a){
if(!a)return 1;
ll now=f(x,a>>1);
now=now*now%p;
if(a&1)now=now*x%p;
return (int)now;
}
杨辉三角
void yhsj(int n){
yh[0][1]=1;
yh[1][1]=1;
yh[1][2]=1;
for(int i=2;i<=n;i++)
for(int j=1;j<=n+1;j++)
yh[i][j]=yh[i-1][j-1]+yh[i-1][j];
return;
}