1、gcd(o(logn))
注:用于求a,b的最大公约数
int gcd(int a,int b){return b==0?a:gcd(b,a%b);}
2、extend_gcd(o(logn)):
注:用于求出a,b的最大公约数,且求出x,y满足:ax+by=gcd(a,b);
具体证明过程:https://blog.csdn.net/Mr_Kingk/article/details/103448975
int extend_gcd(int a,int b,int &x,int &y)
{
if(b==0){
x=1;y=0;
return a;
}
else{
int result=extend_gcd(b,a%b,y,x);
y-=x*(a/b);
return result;
}
}
3、 素数筛选法:
时间复杂度o(n)
primes[]中依次存1~n中所有素数,vis[i]=true说明i不是素数,vis[i]=false说明i是素数
void get_primes(int n)
{
for(int i=2;i<=n;i++){
if(!vis[i]) primes[cnt++]=i;
for(int j=0;primes[j]*i<=n;j++){
vis[primes[j]*i]=true;
if(i%primes[j]==0) break;
}
}
}
4、得到质因子p在n!中的幂次(即:1-n这n个数中p的倍数的个数)o(n/ogn):
int get_num(int p,int n)//返回n!中因子p的个数=n/p+n/p^2+n/p^3+...
{
int s=0;
while(n) s+=n/p,n/=p;
return s;
}
5、分解质因子(将a分解成质数乘积的形式):
for(int i=2;i<=a;i++){//分解质因子模板(将a分解成所有质因子之积的形式)
int cnt=0;//cnt记录当前质因子个数
while(a%i==0){//i为a的一个质因子
a/=i;
cnt++;
}
}
6、 约数个数&&约数之和:
一个数可以分解为其素因子之积的形式,即:p1^c1*p2^c2*...*pn^cn
其约数个数为:(c1+1)*(c2+1)*..*(cn+1)
约数之和为:(p1^0