1、求某个数的欧拉函数
欧拉函数的定义
1~N中与N互质的数的个数被称为欧拉函数,记为ϕ(N)。
ϕ(N) = N * (1 - 1/p1) * (1 - 1/p2) ···(1 - 1/pn)。其中,p1, p2, p3 为N的因数。
signed main(){
scanf("%d", &n);
ans = n;
int m = n;
for(int i = 2; i <= m / i; i++){
if(n % i == 0){
while(n % i == 0) {
n /= i;
}
}
}
//如果n > 1,说明n为质数
if(n > 1) ans = ans / n * (n - 1);
cout << ans << endl;
}
2、线性时间内求1~N中的所有的欧拉函数的和
欧拉函数的性质(x为质数)
① ϕ(x) = x - 1;
②如果i mod x == 0, 那么 ϕ(i * x) = x * ϕ(i);
③如果i mod x != 0,那么 ϕ(i * x) = (p - 1) * ϕ(i);
#define int long long int
const int N = 1e6 + 10;
int n, cnt;//cnt标记素数个数
int phi[N];//存每个数的欧拉函数
int prim[N];//存放素数
bool vis[N];//判断是不是素数
int ans;
int getphi(int n){
phi[1] = 1;
for(int i = 2; i <= n; i++){
if( !vis[i] ){
prim[++cnt] = i;
phi[i] = i - 1;
}
for(int j = 1; j <= cnt; j++){
if(i * prim[j] > n) break;
vis[i * prim[j]] = true;
if(i % prim[j] == 0){
phi[i * prim[j]] = prim[j] * phi[i];break;
}
else{
phi[i * prim[j]] = phi[i] * (prim[j] - 1);
}
}
}
for(int i = 1; i <= n; i++){
ans += phi[i];
}
return ans;
}