zoukankan      html  css  js  c++  java
  • LOJ tangjz的背包

    题目大意

    (n) 个物品, 第 (i) 个物品的体积为 (i)
    (f(x)) 为 选择 (m) 个物品, 体积和为 (x) 的方案数
    (V = sum_{i=1}^m (n-i+1))
    (f(1)cdots f(V)) 关于 (w=19190506)(hash)
    (1le mle n le 10^{12})

    subtask 1

    考虑递推
    (f[n,m,x])((a_1,cdots,a_m), a_ige 1, sum a_i = x) 的划分数量
    我们让 (a_i -= 1) , 相当于物品大小变为 ([0,n-1]), 所需体积变成 (x-m)
    枚举 (0) 号物品是否选择
    就得到递推式 (f[n,m,x] = f[n-1,m,x-m] + f[n-1,m-1,x-m])

    举个例子 (前两行平移了一下) :

    f[3,1] =     (0,1,1,1,0,0)
    f[3,2] =     (0,0,0,1,1,1)
    f[4,2] = (0,0,0,1,1,2,1,1)
    

    将第三维 (hash) 起来
    那么 (f[n-1,m-1]) 那边需要补上后面的 (n-m) 个空位
    (f[n-1,m]) 那边不需要

    于是有 (f[n,m] = f[n-1,m] + f[n-1][m-1] w^{n-m})

    subtask 2

    搞搞生成函数什么的.

    subtask 3

    观察本题的递推式, 有 (downarrow), (searrow) 两种移动方式
    每列只能用恰好一次 (searrow.~~) 确定好在哪里使用 (searrow) 就可以确定路径
    (searrow) 标号. 设标号为 (i)(searrow) 在第 (p_i) 行使用
    我们要算的东西是: $$sum_{1le p_1lt p_2lt cdotslt p_mle n} frac{prod_{i=1}^m w{p_i}}{prod_{i=1}m w^i}$$
    考虑如下的变换 :
    (p'_i = p_i - sum_{j<i} [p_j<p_i]). 可知 (1le p'_i le n-i+1).
    而对于任一一组满足条件的 (p'), 每次让 (p_i) 选在剩余可选位置中第 (p') 个即可. 构成双射.
    (sigma(p)) 表示 (p) 中的顺序对个数
    那么 (prod w^{p'_i} = w^{-sigma(p)} prod w^{p_i})

    (S)(sum_{排列(置换)} w^{sigma})
    我们对原式做一下变换

    [egin{aligned} & sum_{1le p_1lt p_2lt cdotslt p_mle n\1le q_1lt q_2lt cdots lt q_m le m}frac{ prod w^{p_i} } { prod w^{q_i} } && 等价形式\ &= sum_{p, q} frac{ w^{sigma(p)} prod w^{p_i} } { w^{sigma(q)} prod w^{q_i} } && 上下同时乘S, 并将置换作用在p,q上\ &= sum_{p', q'} frac{ prod w^{p'_i} } { prod w^{q'_i} }\ &= frac{ prod_{i=1}^m (sum_{j=1}^{n-i+1} w^j) } { prod_{i=1}^m (sum_{j=1}^{m-i+1} w^j)} && 交换计算顺序\ &= frac{ prod_{i=1}^m (sum_{j=0}^{n-i} w^j) } { prod_{i=1}^m (sum_{j=0}^{m-i} w^j)} && 上下同时除w^m \ &= frac{ [n]^{underline m} } { [m]! } && [k] = frac{q^k-1}{q-1}(等比数列和)\ &= frac{ prod_{i=1}^m (q^{n-i+1}-1) } { prod_{i=1}^m (q^i-1) }\ end{aligned} ]

    其实 (f[n,m] = {inom n m}_w)
    关于本题递推式的更多信息可以参考wiki

    subtask 4

    先回顾 lucas 定理 : (inom n m equiv inom {lfloor frac n p floor}{lfloor frac m p floor} inom {nmod p}{mmod p} pmod p)
    证明 :
    (n!mod p = (prod_{i=1}^{lfloor frac n p floor} ip)~(prod_{i=1}^{p-1})^{lfloor frac n p floor}~(prod_{i=1}^{nmod p} i))
    也即分成三个部分, 整除部分, 整块部分, 剩余部分
    只有第一部分有 (p). 它可以写成 (p^{lfloor frac n p floor} lfloor frac n p floor !)
    (1) (lfloor frac {n-m} p floor + lfloor frac m p floor < lfloor frac n p floor)
    此时幂部分 (p) 有剩余, 阶乘部分剩余为整数, 无法将 (p) 抵消. 值为 (0)
    对应的, 在lucas定理中, (nmod p + mmod p > p), 使得组合数值为 (0)
    (2) (lfloor frac {n-m} p floor + lfloor frac m p floor = lfloor frac n p floor)
    此时原式中的第一部分剩下的是组合数, 第二部分抵消, 第三部分不变.

    这样不用生成函数来证明, 更容易推广一些

    推广到这一题:
    考虑令 (w^a-1equiv 0) 的最小的 (a)
    (fac[n] = prod_{i=1}^n (q^i-1))
    那么 (fac[n] = (prod_{i=1}^{lfloor frac n a floor}q^{ai}-1)~(prod_{i=1}^{n-1} q^i-1)^{lfloor frac n a floor}~(prod_{i=1}^{nmod a} q^i-1))
    因式分解 (q^{ai}-1 = (q^a-1)(sum_{k=0}^{i-1}q^{ak}) = i(q^a-1))
    因此 $fac[n] = (qa-1){lfloor frac n p floor} lfloor frac n p floor! ( 剩下的推导就同理了, 最终得到: ){inom n m}_w = inom {lfloor frac n a floor}{lfloor frac m a floor} {inom {nmod a}{mmod a}}_w$

  • 相关阅读:
    SQL Server参数化查询
    MySQL平台数据库备份方案详细说明
    Android 关机弹出菜单
    android 4.1源码下载方法最新实例教程
    教你如何创建类似QQ的android弹出菜单
    三足鼎立已深入人心 移动开发平台前景展望
    Android上的蓝牙通信功能的开发:BluetoothChat例程分析
    Android经典动画案例分析
    Android使用FileObserver对sdcard文件或文件夹监控
    如何提高Android用户体验
  • 原文地址:https://www.cnblogs.com/acha/p/9207818.html
Copyright © 2011-2022 走看看