题目大意
有 \(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