欧拉函数:
1∼N 中与 N 互质的数的个数被称为欧拉函数,记为 ϕ(N)
若在算数基本定理,N=.........
则:
ϕ(N)=N*.......
分解质因数求欧拉函数 O(sqrt(n)):
//欧拉函数
#include <bits/stdc++.h>
using namespace std;
const int N=110;
int main()
{
int n;
cin>>n;
while(n--)
{
int a;
cin>>a;
int res=a;
for(int i=2;i<=a/i;i++)
{
if(a%i==0)
{
res=res/i*(i-1);
while(a%i==0) a/=i;
}
}
if(a>1) res=res/a*(a-1);//大于sqrt(a)的质因子
cout<<res<<"\n";
}
return 0;
}
筛法求欧拉函数O(n):
在筛素数时求欧拉函数phi(n)
1. p[j]是i的质因子 phi[p[j]*i]=phi[i]*p[j];
2. p[j]不是i的质因子 phi[p[j]*i]=ph[i]*(p[j]-1);
//筛法求欧拉函数 O(n)
#include <bits/stdc++.h>
using namespace std;
const int N=1e6+10;
typedef long long ll;
int p[N],cnt; //存素数
int phi[N]; //欧拉函数
bool vis[N]; //isprime[i]
int main()
{
int n;
cin>>n;
phi[1]=1;
for(int i=2;i<=n;i++)
{
if(!vis[i])
{
p[++cnt]=i;
phi[i]=i-1;
}
for(int j=1;p[j]<=n/i;j++)
{
vis[p[j]*i]=true;
if(i%p[j]==0)
{
phi[i*p[j]]=phi[i]*p[j];
break;
}
else
{
phi[i*p[j]]=phi[i]*(p[j]-1);
}
}
}
ll res=0;
for(int i=1;i<=n;i++) res+=phi[i];
cout<<res;
return 0;
}