00:00:00
一、线性筛
易发现时间复杂度为
如
线性筛就是让每个数只会被一个质数筛去,这个质数就是被筛的合数的最小质因子。
算法代码:
cpp
namespace Eular{
int prime[N],tot;
bool isprime[N];
void eular(int x){
memset(isprime,true,sizeof isprime);
isprime[1]=false;
for(int i=2;i<=x;i++){
if(isprime[i])prime[++tot]=i;
for(int j=1;j<=tot and i*prime[j]<=x;j++){
isprime[i*prime[j]]=false;
if(!(i%prime[j]))break;
}
}
}
}using namespace Eular;为什么当
举例:当
当遍历到
二、欧拉函数
1. 定义
欧拉函数
如
特别的,
2. 解法
可以用容斥原理很快的求出来。
如求
理解例子后,再求更通用的公式:
分解
设
因
由容斥原理,可得:

3. 定理
(1). 若 是质数, 。
因为
(2). 已知 是质数,若 ,则 ,否则 。
先证明第一点。
用同第二章第
将
再证明第二点。
同理得到
三、积性函数
1. 定义
若在正整数域中一个函数
2. 求
(1). 证明 是积性函数
设
因为
则
(2). 解法
设
这样就可以一边欧拉筛一边递推了。
cpp
namespace Phi{
int prime[N],tot,phi[N];
bool isprime[N];
void getphi(int x){
memset(isprime,true,sizeof isprime);
isprime[1]=false;
phi[1]=1;
for(int i=2;i<=x;i++){
if(isprime[i]){
prime[++tot]=i;
phi[i]=i-1;
}
for(int j=1;j<=tot and i*prime[j]<=x;j++){
isprime[i*prime[j]]=false;
if(i%prime[j])phi[i*prime[j]]=(prime[j]-1)*phi[i];
else{
phi[i*prime[j]]=prime[j]*phi[i];
break;
}
}
}
}
}using namespace Phi;