数论与求和问题

求欧拉函数

ll calphi(ll x){
	ll ret=x;
	for(ll i=2;i<=x/i;i++){
		if(x%i==0){
			ret=ret/i*(i-1);
			while(x%i==0)x/=i;
		}
	}
	if(x>1)ret=ret/x*(x-1);
	return ret;
}

求莫比乌斯函数

ll calmu(ll x){
	ll ret=1;
	for(ll i=2;i<=x/i;i++){
		if(x%i==0){
			ret=-ret,x/=i;
			if(x%i==0)return 0;
		}
    }
	if(x>1)ret=-ret;
	return ret;
}

线性筛求质数、最小质因子、欧拉函数和莫比乌斯函数

ll n,q,fac[N],phi[N],mu[N];
vector<ll> prime;
mu[1]=1,phi[1]=1;
for(ll i=2;i<=n;i++){
	if(fac[i]==0)fac[i]=i,prime.push_back(i),mu[i]=-1,phi[i]=i-1;
	for(ll j=0;j<prime.size();j++){
		if(prime[j]>fac[i]||prime[j]>n/i)break;
		fac[i*prime[j]]=prime[j];
		mu[i*prime[j]]=(i%prime[j]?-mu[i]:0);
		phi[i*prime[j]]=phi[i]*(i%prime[j]?prime[j]-1:prime[j]);
	}
}
posted @ 2024-01-07 17:14  Alric  阅读(2)  评论(0编辑  收藏  举报