欧拉函数

欧拉函数的定义

欧拉函数(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;
}
posted @ 2022-07-07 14:56  Narcissist  阅读(413)  评论(0)    收藏  举报