经典的Mobius反演
LuoguP3455 [POI2007]ZAP - Queries
本文同步发表于博主的Cmd Markdown Blog.
题目描述
给定$n,m,k$,求以下式子的值:
$$\sum_{i=1}^n \sum_{j=1}^m [\gcd(i,j) = k]$$
Input & Output’s examples
Input’s examples
1 | 2 |
Output’s examples
1 | 3 |
分析
比较显然的Mobius反演题目,没学过莫反的别尝试暴力了
我们来一起推一下式子(注意:以下的分数默认向下取整)。
$$\sum_{i=1}^n \sum_{j=1}^m [\gcd(i,j) = k]$$
同时除一下$k$:
$$\sum_{i=1}^{\frac nk} \sum_{j=1}^{\frac mk} [\gcd(i,j) = 1]$$
由Mobius函数的定义式:
$$\sum_{d | n} \mu(d) = [n = 1]$$
我们把$gcd(i,j)$代入可得。
$$\sum_{d|gcd(i,j)} \mu(d) = [\gcd(i,j) = 1]$$
所以,原式可以简化为:
$$\sum_{i=1}^{\frac nk} \sum_{j=1}^{\frac mk} \sum_{d | \gcd(i,j)} \mu(d)$$
我们变换枚举顺序,首先枚举$d$,将它的求和符号提前,后面内容则变为布尔表达式
$$\sum_{d=1}^{\min { \frac nk,\frac mk }} \sum_{i=1}^{\frac nk} \sum_{j=1}^{\frac mk} [d | \gcd(i,j)] \mu(d)$$
因为$d | \gcd(i,j)$,那么我们只需要枚举$d$的倍数即可,同时除一下$d$:
$$\sum_{d=1}^{\min { \frac nk,\frac mk }} \sum_{i=1}^{\frac {n}{kd}} \sum_{j=1}^{\frac {m}{kd}} [\gcd(i,j) \in Z] \mu(d)$$
显然$\gcd(i,j) \in Z$恒成立,那么直接去掉。
$$\sum_{d=1}^{\min { \frac nk,\frac mk }} \sum_{i=1}^{\frac {n}{kd}} \sum_{j=1}^{\frac {m}{kd}} \mu(d)$$
$i,j$已经消失,那么我们直接根据乘法分配率:
$$\sum_{d=1}^{\min { \frac nk,\frac mk }} \lfloor \frac {n}{kd} \rfloor \lfloor \frac {m}{kd} \rfloor \mu(d)$$
因为$\mu(d)$是不完全积性函数,我们可以$O(n)$求和。
但是本题要求多组数据,于是我们可以数论分块一下,然后预处理$\mu$前缀和。
代码
1 | /* Headers */ |