数论()

1.CRT中国剩余定理

2.拓展欧几里德

int exgcd(int a,int b,int &x,int &y){
	if(b==0){x=1;y=0;return a;}
	int d=exgcd(b,a%b,y,x);//d是最大公约数
	y-=a/b*x;return d;
}

对于\(ax+by=1\) ,
有解时\(1\%gcd(a,b)=0\) ,
得到\(bx_2+(a-a/b\times b)y_2=1\) ,
此时\(x=y_2,y=x_2-a/b\times y2\) ,
用辗转相除法得到最终\(b=0\)时,此时\(a\)即为\(gcd(a,b)\),解为\(x=1,y=0\)。
解出最小解\(x_0\)。

此时\(y=(1-ax)/b\),如果\(x\)要增加,那么保持\(y\)为整数,则\(x\)应加上\(b\)的倍数(因为\(gcd(a,b)=1\),所以乘上\(a\)并无用)
然后得到\(x_i=x_0+kb\),
要得到最小正整数解\(x_i\),只要\(x_i=(x_0\%b+b)\%b\)。(如果b小于0:)

b=-b

一般题目里是\(ax+by=C\),(\(C\)是\(gcd(a,b)\)的倍数的话,有解)
解出\(ax+by=1\)后, 可以得到 \(axC+bxC=C\),\(axC/(gcd(a,b))+bxC/(gcd(a,b))=C/(gcd(a,b)\),
所以\(x\)乘上\(C/(gcd(a,b))\)。解出一组\(x\)后,其他解为\(x_i=x_0+kb/(gcd(a,b)\)。

证明:
\(ax_0+bx_0=C\),\(ax_i+bx_i=C\)。
\(a/gcd(a,b)(x_i-x_0)=-b/gcd(a,b)(y_i-y_0)\),
因为\(gcd(a,b)=1\),
所以\((x_i-x_0)\%(b/gcd(a,b))=0)\)
所以\(x_i=x_0+kb/(gcd(a,b)\)。(PS:不太懂2022.10.11)

3.质因数分解

普通的质因数分解是\(O(\sqrt n)\)的。

int tmp=x;
for(int i=2;i*i<=x;i++){
	if(tmp%i)continue;
	cout<<tmp<<" ";
	while(tmp%i==0)tmp/=i;
}
if(tmp>1)cout<<tmp<<" ";

当然你可以打质数筛优化这个过程\(O(faster)\)。

for(int j=1;prime[j]<=sqrt(a[i]);j++){
	while(tmp%prime[j]==0){
		ans+=check(prime[j]);
		tmp/=prime[j];
	}
}
if(tmp>1)ans+=check(tmp);

4.线性求乘法逆元

首先,p为质数。

inv[1]=1;
inv[i]=(p-p/i)*(inv[p%i])%p;

5.lucas定理

\(C_{n}^{m}=C_{n/p}^{m/p}\times C_{n\%p}^{m\%p}\)
p为质数。

6.欧拉函数

套路是找到一个\(gcd(a,b)=c\),变为\(gcd(a/c,b/c)=1\)。

phi[1]=1;bk[1]=1;
for(int i=2;i<=maxn;i++){
	if(!bk[i]){
		prime[++tot]=i;
		phi[i]=i-1;
	}
	for(int j=1;j<=tot;j++){
		if(i*prime[j]>maxn)break;
		bk[i*prime[j]]=1;
		phi[i*prime[j]]=phi[i]*(i%prime[j]?prime[j]-1:prime[j]);
		if(i%prime[j]==0)break;
	}
}

你也可以质因数分解做(也可以用质数筛优化)

int phi(int x){
	int ans=x;int tmp=x;
	for(int i=2;i*i<=x;i++){
		if(tmp%i)continue;
		ans=ans/i*(i-1);
		while(tmp%i==0)tmp/=i;
	}
	if(tmp>1)ans=ans/tmp*(tmp-1);
	return ans;
}

7.组合数公式

  • \(C(n,k)=C(n,n-k)\)
  • \(C(n,k)+C(n,k+1)=C(n+1,k+1)\)
  • \(C(n,k+1)=C(n,k)\times (n-k)/(k+1)\)

8.欧拉筛

for(int i=2;i<=n;i++){
	if(bk[i]==0)prime[++tot]=i;
	for(int j=1;j<=tot;j++){
		if(prime[j]*i>n)break;
		bk[prime[j]*i]=1;
		if(i%prime[j]==0)break;
	}
}

9.高斯消元

10. 费马小定理

若\(x\)是\(a\mod p\)下的逆元,则\(x=a^{p-2}\)(\(p\)为质数) 。

11.拓欧求逆元

若\(x\)是\(a\mod p\)下的逆元,则\(x\times a=1(\mod p)\),所以\(ax+py=1\),那么用拓欧即可求出\(x\)

12.除法分块

\(\color{darkblue}\text{P2261 [CQOI2007]余数求和}\)

2147483647.其他

立方差公式:\(a^3-b^3=(a-b)(a^2+ab+b^2)\) 。
\(\sum_{i=1}^ni^2=n\times (n+1)\times (2n+1)/6\)。

————————

1.CRT中国剩余定理

2.拓展欧几里德

int exgcd(int a,int b,int &x,int &y){
	if(b==0){x=1;y=0;return a;}
	int d=exgcd(b,a%b,y,x);//d是最大公约数
	y-=a/b*x;return d;
}

对于\(ax+by=1\) ,
有解时\(1\%gcd(a,b)=0\) ,
得到\(bx_2+(a-a/b\times b)y_2=1\) ,
此时\(x=y_2,y=x_2-a/b\times y2\) ,
用辗转相除法得到最终\(b=0\)时,此时\(a\)即为\(gcd(a,b)\),解为\(x=1,y=0\)。
解出最小解\(x_0\)。

此时\(y=(1-ax)/b\),如果\(x\)要增加,那么保持\(y\)为整数,则\(x\)应加上\(b\)的倍数(因为\(gcd(a,b)=1\),所以乘上\(a\)并无用)
然后得到\(x_i=x_0+kb\),
要得到最小正整数解\(x_i\),只要\(x_i=(x_0\%b+b)\%b\)。(如果b小于0:)

b=-b

一般题目里是\(ax+by=C\),(\(C\)是\(gcd(a,b)\)的倍数的话,有解)
解出\(ax+by=1\)后, 可以得到 \(axC+bxC=C\),\(axC/(gcd(a,b))+bxC/(gcd(a,b))=C/(gcd(a,b)\),
所以\(x\)乘上\(C/(gcd(a,b))\)。解出一组\(x\)后,其他解为\(x_i=x_0+kb/(gcd(a,b)\)。

证明:
\(ax_0+bx_0=C\),\(ax_i+bx_i=C\)。
\(a/gcd(a,b)(x_i-x_0)=-b/gcd(a,b)(y_i-y_0)\),
因为\(gcd(a,b)=1\),
所以\((x_i-x_0)\%(b/gcd(a,b))=0)\)
所以\(x_i=x_0+kb/(gcd(a,b)\)。(PS:不太懂2022.10.11)

3.质因数分解

普通的质因数分解是\(O(\sqrt n)\)的。

int tmp=x;
for(int i=2;i*i<=x;i++){
	if(tmp%i)continue;
	cout<<tmp<<" ";
	while(tmp%i==0)tmp/=i;
}
if(tmp>1)cout<<tmp<<" ";

当然你可以打质数筛优化这个过程\(O(faster)\)。

for(int j=1;prime[j]<=sqrt(a[i]);j++){
	while(tmp%prime[j]==0){
		ans+=check(prime[j]);
		tmp/=prime[j];
	}
}
if(tmp>1)ans+=check(tmp);

4.线性求乘法逆元

首先,p为质数。

inv[1]=1;
inv[i]=(p-p/i)*(inv[p%i])%p;

5.lucas定理

\(C_{n}^{m}=C_{n/p}^{m/p}\times C_{n\%p}^{m\%p}\)
p为质数。

6.欧拉函数

套路是找到一个\(gcd(a,b)=c\),变为\(gcd(a/c,b/c)=1\)。

phi[1]=1;bk[1]=1;
for(int i=2;i<=maxn;i++){
	if(!bk[i]){
		prime[++tot]=i;
		phi[i]=i-1;
	}
	for(int j=1;j<=tot;j++){
		if(i*prime[j]>maxn)break;
		bk[i*prime[j]]=1;
		phi[i*prime[j]]=phi[i]*(i%prime[j]?prime[j]-1:prime[j]);
		if(i%prime[j]==0)break;
	}
}

你也可以质因数分解做(也可以用质数筛优化)

int phi(int x){
	int ans=x;int tmp=x;
	for(int i=2;i*i<=x;i++){
		if(tmp%i)continue;
		ans=ans/i*(i-1);
		while(tmp%i==0)tmp/=i;
	}
	if(tmp>1)ans=ans/tmp*(tmp-1);
	return ans;
}

7.组合数公式

  • \(C(n,k)=C(n,n-k)\)
  • \(C(n,k)+C(n,k+1)=C(n+1,k+1)\)
  • \(C(n,k+1)=C(n,k)\times (n-k)/(k+1)\)

8.欧拉筛

for(int i=2;i<=n;i++){
	if(bk[i]==0)prime[++tot]=i;
	for(int j=1;j<=tot;j++){
		if(prime[j]*i>n)break;
		bk[prime[j]*i]=1;
		if(i%prime[j]==0)break;
	}
}

9.高斯消元

10. 费马小定理

若\(x\)是\(a\mod p\)下的逆元,则\(x=a^{p-2}\)(\(p\)为质数) 。

11.拓欧求逆元

若\(x\)是\(a\mod p\)下的逆元,则\(x\times a=1(\mod p)\),所以\(ax+py=1\),那么用拓欧即可求出\(x\)

12.除法分块

\(\color{darkblue}\text{P2261 [CQOI2007]余数求和}\)

2147483647.其他

立方差公式:\(a^3-b^3=(a-b)(a^2+ab+b^2)\) 。
\(\sum_{i=1}^ni^2=n\times (n+1)\times (2n+1)/6\)。