歐拉函數

直接求一個數的歐拉函數

ll eular(ll x)
{
	ll res=x;
	for(int i=2;i*i<=x;i++)
	{
		if(x%i==0)
		{
			res=res/i*(i-1);
			while(x%i==0)
			{
				x/=i;
			}
		}
	}
	if(x>1)
	{
		res=res/x*(x-1);
	}
	return res;
}

歐拉函數打表

void quick_euler()
{
	int cnt=0;
	for(int i=2;i<=N;i++)
	{
		if(v[i]==0)	
			prime[++cnt] = i , phi[i]= i-1;
		for(int j=1 ; prime[j]*i<=N && j<=cnt ; j++ )
		{
			v[ prime [ j ] * i ]=1;
			if(i%prime[j]==0)
			{
				phi[i*prime[j]]=phi[i]*prime[j];
			 	break;
			 }
			 else
			 	phi[i*prime[j]]=phi[i]*(prime[j]-1);
		}
	}
}


發佈了59 篇原創文章 · 獲贊 1 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章