JZOJ5787 轨道

JZOJ5787 轨道

题目大意

给出 \(n\)\(m\)

需要构造一个长度为 \(n\) 的正整数序列 \(A\),其中 \(A_i \in [1,m]\)

给出一个正整数 \(K\)。你的序列需要使的存在一个正整数 \(V\),使得 \(V \cdot K = \prod A_i\)\(V\)\(K\) 互质。

求出构造方案数。

其中 \(n \leq 30001, m \leq 10^9, K \leq 10^7\)

解题思路

考虑 DP\(dp(i,j)\) 表示构造到 \(i\) 位,使得 \(\prod A_i = j\) 的方案数。

这样显然开不下,但是发现其实我们只关心 \(\gcd(j,K)\)

显然 \(\gcd(j,K)\)\(K\) 的因数,我们将因数全部预处理出来,从小到大排列,记为数列 \(a\),这不会太多,数量 \(at \leq 1000\)

同时记 \(mp(i)\) 表示 \(i\)\(K\) 的因数中的排名。

所以我们将 \(dp(i,j)\) 含义改成:构造到 \(i\) 位,使得 \(\gcd(\prod A_i,K) = a[j]\) 的方案数。

那么我们可以推出状态转移方程:

\[dp(i,j) = \sum_{a(k)|a(j)} dp(i-1,k) \cdot dp(1,mp(\tfrac{a(j)}{a(k)})) \]

考虑如何实现转移,我们可以预处理出 \(a(j)\) 的所有因数,这将耗费 \(O(at^2) \leq 10^6\) 的时间。

经过预处理,转移的总时间消耗为 \(O(n\sum \sigma_0(a(i))) \leq 2*10^4 n \leq 6*10^8\),实际上这个数字会更加的小,其中 \(\sigma_0\) 表示因数个数。

我们解决了转移问题,接下来考虑如何求出 \(dp(1,j)\)

考虑其含义,即数 \(x \in [1,m]\) 使得 \(\gcd(x,K) = a(j)\) 并且 \(\gcd(\frac{x}{a(j)},K) = 1\) 的个数。

直接枚举不可行,考虑进行一步转化,第二个条件等价于:

\[\gcd(\frac{x}{a(j)},\frac{K}{a(j)}) = 1 \]

第三个条件可以推出条件二,故关键在于条件三。

\[\gcd(\frac{x}{a(j)},K) = 1 \]

\(y \in [1,\dfrac{m}{a(j)}]\)

即求 \(y\)\(K\) 互质的个数,使用容斥原理。

\(1\) 的倍数,减去 \(2\) 的倍数,减去 \(3\) 的倍数,加上 \(6\) 的倍数等等,的小学问题。

更具体的其容斥系数即为莫比乌斯函数 \(\mu\),不难理解。

更严谨的,使用莫比乌斯反演:

\[f(i) = \sum_{j}^{N} [\gcd(j,K)=i] \\ F(i) = \sum_{i|j} f(j) = \sum_{j}^{N} [i|\gcd(j,K)] = \lfloor \frac{N}{i} \rfloor \]

其中要求 \(i|K\)

根据莫比乌斯反演,所求 \(f(1)\) 即为:

\[f(1) = \sum_{i|K} \mu(i) F(i) \]

线性筛出莫比乌斯函数 \(O(K) \leq 10^7\),预处理 \(O(at^2) \leq 10^6\)

至此,我们解决了这个问题。

参考代码

posted @ 2024-06-07 10:48  DeepSeaSpray  阅读(2)  评论(0编辑  收藏  举报