问题引入:
给定整数 N 和 M。求满足 且 为质数的点对 的个数。
数据范围:
接下来会见到以下内容:
- 莫比乌斯函数
- 莫比乌斯函数的线性筛
- 迪利克雷卷积介绍
- 莫比乌斯反演
- 整除分块
- 杜教筛介绍
莫比乌斯函数:
这里 else 是指:n有大于1的平方因子的情况,如,4、9、16等。
莫比乌斯函数的线性筛:
其实,莫比乌斯函数线性筛与普通的线性筛基本相同,只是多了一个 mu[MAXN] 数组罢了。
int prime[MAXN], prime_tot;//prime[MAXN]用于保存质数,prime_tot是质数的个数;
bool prime_tag[MAXN];//标记是否为质数,false表示是质数,true表示合数;
int mu[MAXN];//保存n的莫比乌斯函数值;
void pre_calc(int lim){
mu[1] = 1;
for (int i = 2; i <= lim; ++i) {
if(!prime_tag[i]) {
prime[++prime_tot] = i;
mu[i] = -1;
//质数的莫比乌斯函数值必为-1;
}
for (int j = 1; j <= prime_tot; ++j) {
if(i * prime[j] > lim)break;
prime_tag[i * prime[j] ] = true;
//质数的倍数必是合数
if(i % prime[j] == 0) {
//如果 i能被质数整除 说明 i中必有同一个质数因子
//那么 i*prime[j] 就必有平方因子
mu[i * prime[j] ] = 0;
break;
}
else {
mu[i * prime[j] ] = -mu[i];
}
}
}
}
狄利克雷卷积介绍:
狄利克雷卷积是函数之间的运算。
狄利克雷卷积:。
积性函数:对于任意互质的整数 a和b 有性质 的函数。
完全积性函数:对于任意整数 a和b 有性质 的函数。
证明:
设 n 不同的因子的个数为 k,则有