zoukankan      html  css  js  c++  java
  • jzoj5787更为优秀做法

    给出一个时间复杂度为(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))的系数即可。

  • 相关阅读:
    window redis 安装配置
    mongodb下载及安装配置教程【仅供参考】
    合并对象
    JSON
    函数声明与函数表达式
    mongodb write 【摘自网上,只为记录,学习】
    javascript 操作cookie
    javascript 将多维数组转换为一维数组
    javascript 去除字符串中重复字符
    javascript 获取url参数
  • 原文地址:https://www.cnblogs.com/ctmlpfs/p/14538927.html
Copyright © 2011-2022 走看看