Description
题目链接:Codeforces 900D
求满足下面两个条件的数列 $a_1,a_2,\dots,a_n(1\le a_i)$ 的个数(答案对 $10^9+7$ 取模):
- $\gcd(a_1,a_2,\dots,a_n)=x$
- $\sum_{i=1}^n a_i=y$
数据范围:$1\le x.y\le 10^9$
Solution
如果在 $x\nmid y$ 的情况下,显然无解。
我们令 $m=\frac{y}{x}$,那么问题转化为:求满足 $\gcd(a_1,a_2,\dots,a_n)=1$ 且 $\sum_{i=1}^n a_i=m$ 的数列个数。
我们先不考虑 $\gcd=1$ 的限制,设 $g(x)$ 表示 $\sum_{i=1}^n a_i=x$ 的数列个数。
对于 $g(x)$ 的值,我们可以使用隔板法求解:
我们发现,$g(x)$ 的值又可以通过 $f(x)$ 求得:
接下来介绍两种做法:
递推
我们可以考虑容斥原理:所有序列数量减去不合法的序列数量。我们枚举不合法的序列的 $\gcd$ 记为 $d$,显然 $d$ 必须满足 $d\mid x,d>1$,这样的序列数量为 $f\left(\frac{x}{d}\right)$(当然也可以通过 $g$ 和 $f$ 的关系得到)。
由于一个数的因子的因子也一定是这个数的因子,所以我们发现需要的 $x$ 为 $d(m)$ 个,即不超过 $O(\sqrt m)$ 个,可以直接递归求解。
时间复杂度:$O(d(m)\sqrt m\log m)$
反演
我们发现:
这个式子的本质是 $g=f\ast 1$,通过莫比乌斯反演可以得到:
这样一来我们就可以直接暴力求解了。
时间复杂度:$O\left(\frac{m}{\log m}\right)$
Code
递推
1 |
|
反演
1 |
|