-paozi-

导航

欧拉函数

1.欧拉筛法求素数

int ss(int n)//求小于n的素数个数
{
	int cnt=0;
	for(int i=2;i<n;i++){
		if(!vis[i]){
			prime[++cnt]=i;//如果这个数之前没有被删除,那么这个数是素数 
		}
		for(int j=1;j<=cnt;j++){
			if(i*prime[j]>=n) break;
			vis[i*prime[j]]=1;
			if(i%prime[j]==0) break;
			//这种情况下,这个数以后的一定会被之后的数删除 
		} 
	}
	return cnt; 
}

 

 

2.欧拉函数求1~n中和n互质的个数

(1)直接求解

int sol(int n){ //直接求解欧拉函数 
     int res=n;
	 int 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;
}

 

(2)打表

void sol(int n){ //打表求欧拉函数
     ans[1]=1;
     for(int i=2;i<=n;i++)
       ans[i]=i;
     for(int i=2;i<=n;i++)
        if(ans[i]==i)//如果这个数 
           for(int j=i;j<=n;j+=i)
              ans[j]=ans[j]/i*(i-1);//先进行除法是为了防止中间数据的溢出 
}

 

posted on 2017-10-28 14:30  -paozi-  阅读(151)  评论(0编辑  收藏  举报