数论相关算法

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]

性质 一定存在一个逆元且只有一个逆元

求逆元

①费马小定理

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;
}

 

你可能感兴趣的:(算法基础)