线性筛法可以在O(n)的时间复杂度下计算出 n 以内的质数。
for(int i = 2; i <= n; i ++){
if(!is[i]){
prime[++pcnt] = i;
}
for(int j = 1; i*prime[j] <= n; j ++){
is[i*prime[j]] = 1;
if(i%prime[j] == 0){
break;
}
}
}
欧拉函数
for(int i = 2; i <= n; i ++){
if(!is[i]){
prime[++pcnt] = i;
phi[i] = i-1;
}
for(int j = 1; i*prime[j] <= n; j ++){
is[i*prime[j]] = 1;
if(i%prime[j] == 0){
phi[i*prime[j]] = phi[i] * prime[j];
break;
}else phi[i*prime[j]] = phi[i] * (prime[j] - 1);
}
}
莫比乌斯函数
for(int i = 2; i <= n; i ++){
if(!is[i]){
prime[++pcnt] = i;
mu[i] = -1;
}
for(int j = 1; i*prime[j] <= n; j ++){
is[i*prime[j]] = 1;
if(i%prime[j] == 0){
mu[i*prime[j]] = 0;
break;
}else mu[i*prime[j]] = mu[i] * -1;
}
}
一般的积性函数
所求的积性函数应该有特殊的办法在等于质数幂次的时候求解。
for(int i = 2; i <= n; i ++){
if(!is[i]){
prime[++pcnt] = i;
low[i] = lowp[i] = i;
f[i] = ...;
}
for(int j = 1; i*prime[j] <= n; j ++){
is[i*prime[j]] = 1;
if(i%prime[j] == 0){
low[i*prime[j]] = prime[j];
lowp[i*prime[j]] = lowp[i] * prime[j];
if(i == lowp[i]) f[i] = ...;
else f[i*prime[j]] = f[i/lowp[i]] * f[lowp[i]*prime[j]];
break;
}else {
low[i*prime[j]] = lowp[i*prime[j]] = prime[j];
f[i*prime[j]] = f[i] * f[prime[j]];
}
}
}
线性预处理逆元
设
P=⌊Pi⌋×i+P%i
一下运算在 %P 的同余系下进行。
−P%i=⌊Pi⌋×i
−P%i×(i)−1×(P%i)−1=⌊Pi⌋×i×(i)−1×(P%i)−1
−(i)−1=⌊Pi⌋×(P%i)−1
(i)−1=−⌊Pi⌋×(P%i)−1
因为 P%i<i 这个数的逆元已经求得,所以借此公式就可以线性处理逆元了。
233