jzoj5787更为优秀做法
给出一个时间复杂度为\(O(d(k)\log_2n\log_2c(k))\)(\(c\)是质因数个数函数)的算法。
原式就是\(vk=\prod a_i\),\(v,k\)互质。
\(k\)已经给出,设唯一分解为\(p_1^{a_1}....p_n^{a_n}\)
则\(v\)的\(p_1,p_2...p_n\)的指数必须是\(0\),其他任意。
就是给\(vk=s\)钦定\(n\)个位置,它的第\(i\)个位置指数必须是\(a_i\),其他任意。
考虑把\(a_i\)表示成\(t*p_1^{b_1}...p_n^{b_n}\)的形式。
则所有\(a\)的\(b_i\)之和必须等于\(a_i\)
把\(p_1^{b_1}...p_n^{b_n}\)视为向量\((b_1,b_2...b_n)\)
这显然可以dp。设\(f_{i,j}\)表示确定\(i\)个数,乘积的向量为\(j\)。
\(j\)这一维只有\(d(k)\)个有效状态。
转移显然,但是我们要计算\(p_1=s_1,p_2=s_2...p_n=s_n\)的数的方案。
考虑容斥,\(p_1\geq s_1,p_2\geq s_2...p_n\geq s_n\)显然是\(\frac{m}{p_1^{s_1}...p_n^{s_n}}\)
设\(f_{(s_1,s_2...s_n)}=p_1=s_1,p_2=s_2...p_n=s_n\)的方案,\(g_{(s_1,s_2...s_n)}=\frac{m}{p_1^{s_1}...p_n^{s_n}}\)。
高维差分即可。
转移的过程可以被视为一个高维fwt(前缀和)的过程。
fwt的运算视为向量的加法。
实际上,dp的转移就是个fwt卷积,就是卷上\(f\)。
实际上就是个fwt的\(n\)次幂,可以对点值进行快速幂。
点值快速幂后逆fwt后查询\((a_1,a_2...a_n)\)的系数即可。

浙公网安备 33010602011771号