此模板主要用来求1-n(n<=1e6)以内的欧拉函数,顺带把素数也筛了出来.欧拉函数表示n以内与n互素的数,其中phi[1]=1。这里主要利用了欧拉函数的两个性质:
1.若p是x的因子,则E(p*x)=p*E(x),证明直接利用算数基本定理就行了。
2.若p是素数,且x与p互素,(即x,p都为素数),则E(p*x)=E(p)*E(x)。
代码:
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 1e6 + 5;
bool vis[maxn];
int phi[maxn],prim[maxn/10],n,cnt;
///n为用户输入
void gephi(){
phi[1] = 1;
for(int i=2;i<=n;i++){
if(!vis[i]) {
phi[i] = i-1;
prim[++cnt] = i;
}
for(int j=1;j<=cnt;j++){
int tp = prim[j];
if(i*tp>n) break;
vis[i*tp]=true;
if(i%tp==0) {
phi[i*tp]=phi[i]*tp;
break;
}else phi[i*tp]=phi[i]*phi[tp];
}
}
}