求欧拉函数

定义

图白嫖huge的

批注 2026-04-11 155049

求单个

int euler_phi(int n)
{
	int ans=n;
	for (int i=2;i*i<=n;i++)
	{
		if (n%i == 0)
		{
			ans=ans/i*(i-1);
			while(n%i == 0) n/=i;
		}
	}
	if (n>1) ans=ans/n*(n-1);
	return ans;
}

求多个

const int maxn=3e6+10;
int phi[maxn];
int prime[maxn];
bool is_no_p[maxn]={1,1};
void Phi(int n)
{
	phi[1]=1;
	for (int i=2;i<=n;i++)
	{
		if (!is_no_p[i])
		{
			prime[++prime[0]]=i;
			phi[i]=i-1;
		}
		for (int j=1;j<=prime[0] && i*prime[j]<=n;j++)
		{
			is_no_p[i*prime[j]]=1;
			if (i%prime[j] == 0)
			{
				phi[i*prime[j]]=prime[j]*phi[i];
				break;
			}
			else
			{
				phi[i*prime[j]]=(prime[j]-1)*phi[i];
			}
		}
	}
}
posted @ 2026-04-11 15:53  msjing  阅读(3)  评论(0)    收藏  举报