数论知识

埃氏筛打表求素数

void isprime(int n){
    
    
	cnt=0;
	memset(vis,0,sizeof vis);
	for(int i=2;i<n;i++){
    
    
		if(!vis[i]){
    
    
			prime[cnt++]=i;
			for(int j=i*i;j<n;j+=i)
			vis[j]=1;
		}
	}
}

唯一分解定理求不超过n的因子个数

LL cal(LL n){
    
    
	LL ans=1; 
	for(int i=0;i<cnt&&prime[i]*prime[i]<=n;i++){
    
    
		if(n%prime[i]==0){
    
    
			LL cnt1=0;
			while(n%prime[i]==0){
    
    cnt1++;n/=prime[i];}
			ans*=(1+cnt1);
			if(n==0)break;
		}
	}
	if(n>1)ans*=2;
	return ans;
}

打表法求欧拉phi函数

void phitable(int n){
    
    
	for(int i=2;i<=n;i++)phi[i]=0;
	phi[1]=1;
	for(int i=2;i<=n;i++)if(!phi[i])
	for(int j=i;j<=n;j+=i){
    
    
		if(!phi[j])phi[j]=j;
		phi[j]=phi[j]/i*(i-1);
	}
}

快速幂,快速乘,第50道题给了它(纪念一下)

LL ppow(LL a,LL b,LL mod){
    
    
	LL ans=1;
	while(b>0){
    
    
		if(b&1)ans=ans*a%mod;
		a=a*a%mod;
		b>>=1;
	}
	return ans;
}

LL qpow(LL a,LL b,LL mod){
    
    
	LL ans=0;
	while(b>0){
    
    
		if(b&1)ans=(ans+a)%mod;
		a=(a+a)%mod;
		b>>=1;
	}
	return ans;
}

欧拉定理求调和级数

const double C=0.57721566490153286060651209;
log(n*1.0)+C+1.0/(2.0*n)   //n>1e4

扩展欧几里得算法
在这里插入图片描述

void exgcd(LL a,LL b,LL &d,LL &x, LL &y){
    
    
	if(!b){
    
    
		d=a;x=1;y=0;
		return;
	}
	else exgcd(b,a%b,d,x,y);
	LL t=x;
	x=y;
	y=t-(a/b)*y;
}

在这里插入图片描述
欧拉 定理
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/peizhecpp/article/details/104794068