和质数的线性筛法差不多 多加了几句话
用到了几个定理 请自行百度
这里求的欧拉函数 是指在数论,对正整数n,欧拉函数是小于n的正整数中与n互质的数的数目(φ(1)=1)
1.如果这个数是质数 那么φ(i)=i-1
2.欧拉函数是积性函数
欧拉函数是
积性函数——若m,n互质,

特殊性质:当n为奇数时,
, 证明与上述类似。

若n为质数则

所以代码如下
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#define N 1000
#define ll long long
int prime[10000],phi[10000],flag[10000],ans;
void deal(){
for(int i=2;i<=N;i++)
{
if(!flag[i])
{
prime[++ans]=i;
phi[i]=i-1;
}
for(int j=1;j<=ans;j++){
int to=i*prime[j];
if(to>N) break;
flag[to]=1;
if(i%prime[j]==0){
phi[to]=phi[i]*prime[j];break;
}
else {
phi[i*prime[j]]=phi[i]*(prime[j]-1);
}
}
}
}
int main(){
deal();
printf("PRIME:\n");
for(int i=1;i<=ans;i++)
printf("%d ",prime[i]);
printf("\n");
printf("PHI:\n");
for(int i=1;i<=N;i++)
printf("%d ",phi[i]);
return 0;
}