欧拉函数phi值的计算模板

求小于n且与n互质的整数的个数。告诉你n的唯一分解式

我们可以运用容斥原理,先分别减去是p1,p2,p3..pn的倍数,再加上同时是他们素因子的个数,再减去3个……以此类推即可。

我们可以化简一下公式:f(x)=x*(1-1/p1)*(1-1/p2).....,其中p1,p2.....是n的素因子。

这就是大名鼎鼎的欧拉函数,然后我们可以用编程轻松的解决这个问题

运用求质数的方法,每次找到一个素因子,然后将它除净,就可以保证找到的因子都是素数

#include<bits/stdc++.h>
using namespace std;
int ans,ans2;
int n;

void Find()
{
	int m=int(sqrt(n)+0.5);
	ans=n;
	for(int i=2;i<=m;i++)
		if(n%i==0)
		{
			ans=ans/i*(i-1);//注意运算的顺序,不然有可能超出int的范围
			while(n%i==0) n/=i;
		}
	if(n>1) ans=ans/n*(n-1);	
}
int main()
{
	cin>>n;
	Find(); 
	cout<<ans<<endl;
	return 0;
} 

 我们还可以利用类似筛素数的方法求出1-n所有欧拉函数的phi值~

#include<bits/stdc++.h>
using namespace std;
int ans,ans2;
int n;
int phi[1000];

void Find()
{
	phi[1]=1;
	for(int i=2;i<=n;i++)if(!phi[i])
	{
		for(int j=i;j<=n;j+=i)
		{
			if(!phi[j]) phi[j]=j;
			phi[j]=phi[j]/i*(i-1);
		}
	}
}

int main()
{
	cin>>n;
	Find(); 
	return 0;
} 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值