这次介绍的是一个模板,至于它的推导过程什么的,我现在水平有限还不会,今天的我只介绍这个代码和它的功能,
这个欧拉函数的功能试什么呢?
我们可以通俗地理解为求小于N且与N互质的数的个数(包含1).
就是任意的给你一个整数n,你能够求出从1到n这写数字中与n互质的个数,其中包括1;
这个模板的复杂度是O(n),相对而言复杂度还是比较低的。
你可以把它当成一个工具,每次如果需要用的时候你拿来用就行了;
下面给出模板:
#include<stdio.h>
#define ll long long
//直接求解欧拉函数
ll euler(ll n)
{
ll res=n,a=n;
for(ll i=2;i*i<=a;i++)
{
if(a%i==0)
{
res=res/i*(i-1);//先进行除法是为了防止中间数据的溢出
while(a%i==0) a/=i;
}
}
if(a>1) res=res/a*(a-1);
return res;
}
int main()
{
ll n;
while(~scanf("%lld",&n))
{
ll sum=euler(n);
printf("%lld\n",sum);
}
}