数论与求和问题
求欧拉函数
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]);
}
}