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\)。
至此,我们解决了这个问题。
标签:10,frac,gcd,轨道,sum,JZOJ5787,leq,dp From: https://www.cnblogs.com/DeepSeaSpray/p/18236787