欧拉函数 φ(N)
定义: [1,N)
中与N
互质的正整数的个数
当N=1
时,φ(1) = 1
(与1互质的数就是1本身)
例题 POJ2407
#include<iostream>
using namespace std;
typedef long long LL;
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0)
int t,n;
//求一个数的欧拉函数
int ola(int n){
int ans=n;
for(int i=2;i<=n/i;i++)
if(n%i==0){
ans=ans/i*(i-1);
while(n%i==0) n/=i;
}
if(n>1) ans=ans/n*(n-1);
return ans;
}
int main()
{
while(cin>>t,t){
cout<<ola(t)<<endl;
}
}
欧拉定理
若a
和n
互质,则有
若当n
为质数,即n=p
时,则有
筛法求欧拉函数
int primes[N], cnt; // primes[]存储所有素数
int euler[N]; // 存储每个数的欧拉函数
bool st[N]; // st[x]存储x是否被筛掉
void get_eulers(int n)
{
euler[1] = 1;
for (int i = 2; i <= n; i ++ )
{
if (!st[i])
{
primes[cnt ++ ] = i;
euler[i] = i - 1;
}
for (int j = 0; primes[j] <= n / i; j ++ )
{
int t = primes[j] * i;
st[t] = true;
if (i % primes[j] == 0)
{
euler[t] = euler[i] * primes[j];
break;
}
euler[t] = euler[i] * (primes[j] - 1);
}
}
}