#include<iostream> #include<cstring> #include<cstdio> using namespace std; int prime[100001],mark[1000001];//prime是素数数组,mark为标记不是素数的数组 int tot,phi[100001];//phi为φ(),tot为1~i现求出的素数个数 void getphi(int N){ phi[1]=1;//φ(1)=1 for(int i=2;i<=N;i++){//从2枚举到N if(!mark[i]){//如果是素数 prime[++tot]=i;//那么进素数数组,指针加1 phi[i]=i-1;//根据性质1所得 } for(int j=1;j<=tot;j++){//从现求出素数枚举 if(i*prime[j]>N) break;//如果超出了所求范围就没有意义了 mark[i*prime[j]]=1;//标记i*prime[j]不是素数 if(i%prime[j]==0){//应用性质2 phi[i*prime[j]]=phi[i]*prime[j];break; } else phi[i*prime[j]]=phi[i]*phi[prime[j]];//应用性质3 } } } int N; int main(){ cin>>N; getphi(N); for(int i=1;i<=N;i++){ cout<<i<<":phi ( "<<phi[i]<<" )"<<endl;//输出phi(i) } } /* ①:φ(p)=p-1 ②:φ(p*i)=p*φ(i) (当p%i==0时) ③:φ(p*i)=(p-1)*φ(i) (当p%i!=0时) */
#include<iostream> #include<cstring> #include<cstdio> using namespace std; int prime[100001],mark[1000001];//prime是素数数组,mark为标记不是素数的数组 int tot,phi[100001];//phi为φ(),tot为1~i现求出的素数个数 void getphi(int N){ phi[1]=1;//φ(1)=1 for(int i=2;i<=N;i++){//从2枚举到N if(!mark[i]){//如果是素数 prime[++tot]=i;//那么进素数数组,指针加1 phi[i]=i-1;//根据性质1所得 } for(int j=1;j<=tot;j++){//从现求出素数枚举 if(i*prime[j]>N) break;//如果超出了所求范围就没有意义了 mark[i*prime[j]]=1;//标记i*prime[j]不是素数 if(i%prime[j]==0){//应用性质2 phi[i*prime[j]]=phi[i]*prime[j];break; } else phi[i*prime[j]]=phi[i]*phi[prime[j]];//应用性质3 } } } int N; int main(){ cin>>N; getphi(N); for(int i=1;i<=N;i++){ cout<<i<<":phi ( "<<phi[i]<<" )"<<endl;//输出phi(i) } }
#include<iostream> #include<cstring> using namespace std; long long phi[10000]; long long getphi() { memset(phi,0,sizeof(phi)); phi[1]=0; for(int i=2;i<=1000;i++) { if(!phi[i]) for(int j=i;j<=1000;j=j+i) { if(!phi[j]) phi[j]=j; phi[j]=phi[j]/i*(i-1); } } } int main() { getphi(); for(int i=1;i<=1000;i++) cout<<phi[i]<<" "; }