给出一个时间复杂度为(O(d(k)log_2nlog_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_1geq s_1,p_2geq s_2...p_ngeq 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))的系数即可。