欧拉函数
欧拉函数的定义
欧拉函数(Euler's totient function),即\(φ(n)\),表示的是小于等于 \(n\)和\(n\)互质的数的个数。(摘自oiwiki)
欧拉函数有如下公式
\[ \left\{
\begin{matrix}
φ(n)=n(1-\dfrac{1}{p_1})(1-\dfrac{1}{p_2})...(1-\dfrac{1}{p_k})\\
n=p_1^{s1}p_2^{s2}...p_k^{sk}(si!=0)\end{matrix}
\right.
\]
欧拉函数的性质
欧拉函数为积性函数,若\(gcd(a,b)=1\) 则\(φ(ab)=φ(a)*φ(b)\)
由轻微推测可得
\[φ(ab)=\dfrac{φ(a)φ(b)gcd(a,b)}{φ(gcd(a,b))}
\]
(由此可以用来筛欧拉函数)
筛欧拉函数代码如下(基于线性筛质数)
#include <bits/stdc++.h>
#define N 1000001
#define LL long long
using namespace std;
int prime[N],phi[N],cnt=1;
bool st[N];
LL geteu(int n)
{
LL ans=0;
phi[1]=1;
st[1]=1;
for(int i=2;i<=n;i++)
{
if(st[i]==0)
{
prime[cnt]=i;
phi[i]=i-1;
cnt++;
}
for(int j=1;prime[j]<=n/i;j++)
{
st[prime[j]*i]=1;
if(i%prime[j]==0)
{
phi[i*prime[j]]=prime[j]*phi[i];
break;
}
phi[i*prime[j]]=phi[i]*phi[prime[j]];
}
}
for(int i=1;i<=n;i++)
{
ans+=phi[i];
}
return ans;
}
int main()
{
int n;
memset(phi,1,sizeof(phi));
cin>>n;
cout<<geteu(n)<<endl;
}

浙公网安备 33010602011771号