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 值
\(1\le m\le n \le 10^12\)

subtask 1

考虑递推
\(f[n,m,x]\)\((a_1,\cdots,a_m), a_i\ge 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

考虑一下 \(C(n+m,m)\) 是怎么分析的.
\(\downarrow\), \(\searrow\) 两种移动方式, 右下的移动次数是固定的 (\(m\) 次), 确定好在哪里使用 右下 就可以确定
给 右下移动 标号. 标号为 \(i\) 的 右下移动在第 \(p_i\)
逐个标号确定在哪些行使用右下.
那么第一个标号有 \(n+m\) 种选法, 第二个有 \(n+m-1\) 种, 依次类推
因为我们最终要求标号有序, 最后除 \(m!\) 定序即可
\(\frac { (n+m)^{\underline m} } { m! } = C(n+m, m)\)

考虑本题的递推式, 因为每一列都用恰好一次右下, 因此每种路径的贡献是 \(w^{\sum_{i=1}^m p_i}\) 乘上 \(w^{-m(m+1)/2}\)

subtask 4

todo

猜你喜欢

转载自www.cnblogs.com/acha/p/9207818.html