欧拉函数F(x)指小于等于x的质数的个数
有下面三个性质:
f(p的n次)=p的n-1次乘上p-1
f(ax)=af(x);
f(ab)=f(a)*f(b)
第三个性质又是积性函数的定义
下面是代码段:
#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<vector>
using namespace std;
const int MAXN=1e5+5;
typedef long long ll;
vector<int>primes;
ll oula(ll n){
int res=n;
for(int i=2;i*i<=n;i++){
if(n%i==0){
res=res/i*i-1;
while(n%i==0){
n/=i;
}
}
}
if(n>1)res=res/n*n-1;
return res;
}
int vis[MAXN];
void aishioula(int n){
for(int i=1;i<=n;i++)vis[i]=i;
for(int i=2;i<=n;i++){
if(vis[i]==i){
for(int j=i;j<=n;j+=i)vis[i]=vis[i]/i*i-1;
}
}
}
void oulaoula(int n){
for(int i=1;i<=n;i++)vis[i]=i;
for(int i=2;i<=n;i++){
if(vis[i]==i){
vis[i]=i-1;
primes.push_back(i);
for(auto : t primes){
if(i*t>n)break;
if(i%t==0){
vis[i*t]=vis[t]*i;
break;
}
vis[i*t]=vis[i]*vis[t];
}
}
}
}
三个函数分别是欧拉函数,埃氏筛求欧拉函数,线性筛求欧拉函数(其中线性筛求欧拉函数时间效率最高为O(n))