1. 程式人生 > >歐拉函數phi值的計算模板

歐拉函數phi值的計算模板

1-n cnblogs using ret cin 超出 pre sqrt 個數

求小於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;
} 

歐拉函數phi值的計算模板