欧拉函数模板

欧拉函数模板

这个欧拉函数的代码我调了半天,最后发现错在一个小细节上,直接当场崩溃。
所有的注释都在代码里面,如果不懂的可以去别的地方看看原理。
模板如下:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define INF 0x3f0x3f0x3f
#define MAX 1000000
ll phi[MAX],primes[MAX],primes2[MAX];//phi是用来记录每一个数的欧拉函数值
//primes是用于记录比n小的素数的值,实际上在本段代码里可有可无
//primes2是用于记录可以由 n 分解出来的素数值 
ll getpin(ll n)
{
	int j=-1,t=0;
	iota(phi,phi+n,0); //iota函数的作用是用于顺序赋值,即iota(数组开始,数组结束,初始值)
	//使用iota函数之后,phi的值就变为 phi[0]=0,phi[1]=1,phi[2]=2......phi[n]=n 
	for(int i=2;i<n;i++)
	{
	  if(phi[i]==i)//如果phi[i]的值和i相同就证明是素数/*因为没有被前面的数给筛除 
	 {
		primes[++j]=i;//记录这个素数/*在这段代码里可有可无*/ 
		for(int k=i;k<n;k+=i)//如果这个是素数,就找出比这个数更大的数,并求出其欧拉函数值 
		{
			phi[k]-=phi[k]/i;//欧拉函数的公式 
			if(n%k==0)primes2[t]=phi[k];//找出n可以分解出的最大的数,并计入 
		}
		if(primes2[t])//如果这个素数是n的约数,就一定被记录了,所以t加 1 
		++t;
	 }
	}
	ll sum=1;
	for(int i=0;i<t;i++)
	{
		sum*=primes2[i]; //欧拉函数公式计算 
	}
	return sum;//返回欧拉函数值 
}
int main()//常规的输入输出 
{
	ll n; 
	cin>>n;
	cout<<getpin(n)<<endl;
	return 0;
} 

下面在补充一个欧拉函数的相关运用。
我们知道了欧拉函数的值后就相当于知道了小于n且与n互素的正整数的和
这里直接上公式:
s=n*f(n)/2
其中 f(n)表示n的欧拉函数值。
例如:与7互素的有1,2,3,4,5,6
/*
一开始我不认为1与7互素,但看了看互素的定义后就信了
a1与a2互素:a1与a2的最大公约数为 1 。
所以1与7的最大公约数为1,它们互素。
/
这几个数的和为21=n/2
f(7)=7/2f(7)=7/25=21。

相同的,如果知道了小于n且与n互素的正整数之和后,就可以求出小于n且与n非素数的正整数之和。具体怎么操作我就不演示了,就是用总数-和就AC了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值