莫比乌斯反演
#include<cstdio>
#include<algorithm>
using namespace std;
const int L = 66666;
int mu[L],primes[L];
bool isPrime[L];
int n,num;
void sieve(){
fill(isPrime,isPrime + L,true);
mu[1] = 1;
num = 0;
for(int i = 2;i < L;++i){
if(isPrime[i]){
primes[num++] = i;
mu[i] = -1;
}
static int d;
for(int j = 0;j < num && (d = i * primes[j]) < L;++j){
isPrime[d] = false;
if(i % primes[j] == 0){
mu[d] = 0;
break;
}else{
mu[d] = -mu[i];
}
}
}
}单个欧拉函数求法
int n;
int phi(int n)
{
int ans,i,k;
if(n==1)
ans=1;
else
{
ans=n;
k=1;
for(i=2;n!=1;i+=k)
{
if(n%i==0)
{
ans/=i;
ans*=(i-1);
while(n%i==0) n/=i;
i=k;
}
}
}
return ans;
}欧拉筛
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
const int maxn=40000+10;
int n,phi[maxn],prime[maxn],len,ans;//phi是欧拉函数,prime是素数表
bool vis[maxn];//布尔型判断是否是质数
int main(){
scanf("%d",&n);
if(n==1){
printf("%d\n",0);
return 0;
}
for(int i=2;i<=n;i++){
if(!vis[i]){
prime[++len]=i;//如果是素数的话,它的欧拉函数就等于他自己-1
phi[i]=i-1;
}
for(int j=1;j<=len;j++){
if(prime[j]*i>n)break;
vis[prime[j]*i]=1;
if(i%prime[j]!=0)
phi[i*prime[j]]=phi[i]*(prime[j]-1);
else{
phi[i*prime[j]]=phi[i]*prime[j];
break;
}
}
}
return 0;
}
本文介绍了莫比乌斯反演的基本概念及其C++实现,并提供了两种求解欧拉函数的方法:单个求解和使用欧拉筛算法进行批量计算。
590

被折叠的 条评论
为什么被折叠?



