在数论,对正整数n,欧拉函数是小于n的正整数中与n互质的数的数目(φ(1)=1)。
欧拉线性筛法可以一次性求出欧拉函数值和判断出是否为素数
#include<bits/stdc++.h>
#define N 600000
using namespace std;
int n;
int phi[N+10],prime[N+10],tot,ans;
bool mark[N+10];//标记素数
int main()
{
int i,j;
phi[1]=1;
for(i=2; i<=N; i++)
{
if(!mark[i])//如果是素数
{
prime[++tot]=i;//第一个素数
phi[i]=i-1;//素数的phi就是i-1
}
for(j=1; i*prime[j]<=N&&j<=tot; j++)
{
mark[i*prime[j]]=1;//i*prime[j]不是素数
if(i%prime[j]==0)
{
phi[i*prime[j]]=phi[i]*prime[j];
break;
}
else
{
phi[i*prime[j]]=phi[i]*(prime[j]-1);
}
/*
①:φ(p)=p-1
②:φ(p*i)=p*φ(i) (当p%i==0时)
③:φ(p*i)=(p-1)*φ(i) (当p%i!=0时)
*/
}
}
int k;
cin>>k;
if(mark[k])
cout<<"ok"<<endl;
else
cout<<phi[k];
}