欧拉函数——求小于N且与N互质的数的个数

对一个正整数N,欧拉函数是小于N且与N互质的数的个数.。
题目: https://www.luogu.org/problemnew/show/P2158
题解:
裸的欧拉函数题。e(i)为有多少个小于i的与i互质的数。可以把点看做坐标轴。求左下角的点是(1,1),然后求有多少个点(1,1)相连斜率不同的一次函数y=kx。求k的个数。因为k=y/x。想要y/x不同,y与x一定互质(k=y/x=yz/xz),不同的互质数相除又一定不同。所以只要求在n范围内有多少对x,y互质。就相当于求ans+=e[i] (2<=i<=n)。第一列和第一行特殊考虑,ans=2。n–。再求ans+=e[i] (2<=i<=n)即可。

#include
using namespace std;
int main()
{
	int n;
	int e[40005];
	cin>>n;
	if(n==1)
	{//特判
		cout<<0;
		return 0;
	 } 
	for(int i=1;i<=n;i++) e[i]=i;
	for(int i=2;i<=n;i++)
	    if(e[i]==i){
	        for(int j=i;j<=n;j+=i)
	            e[j]=e[j]/i*(i-1);
	    }
	int ans=0;
	for(int i=2;i

欧拉函数——求小于N且与N互质的数的个数_第1张图片

模板:

int euler(int n){ //返回euler(n) 
     int res=n,a=n;
     for(int 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;
}

//筛选法打欧拉函数表 
#define Max 1000001
int euler[Max+1];
void Init(){ 
     for(int i=1;i<=Max;i++)
       euler[i]=i;
     for(int i=2;i<=Max;i++)
        if(euler[i]==i)
           for(int j=i;j<=Max;j+=i)
              euler[j]=euler[j]/i*(i-1);//先进行除法是为了防止中间数据的溢出 
}

https://blog.csdn.net/nan81962325/article/details/79964951
https://blog.csdn.net/qq_39520417/article/details/81940687

你可能感兴趣的:(C语言,OJ刷题,模板)