发现这是一个背包问题,而(k)又很大,考虑生成函数方式解决这个问题。
对于体积为(1)的物品的生成函数为(frac{1}{1 - x}),体积为(2)的物品的生成函数为(frac{1}{1 - x^2}),那么我们要求的就是([x^k](frac{1}{1-x})^n (frac{1}{1-x^2})^m)。
而((frac{1}{1-x})^n = (frac{1}{1-x^2})^n imes (1 + x)^n),所以原生成函数等于((frac{1}{1 - x^2})^{n+m}(1+x)^n)。
注意到后面一部分((1+x)^n)只有(n+1)项。我们枚举((1+x)^n)中(x^i)项对答案产生的贡献,那么我们需要求出([x^i](1+x)^n)和([x^{k-i}](frac{1}{1-x^2})^{n+m})。前者由二项式定理可得为(inom{n}{i}),后者可以发现相当于有(n+m)个容量为(2)、数量无限的物品,要从中取出(frac{k - i}{2})个物品的本质不同的方案数。这个问题是经典的插板模型,不难得到后者为([2 mid (k-i)] inom{frac{k-i}{2} + n + m - 1}{n + m - 1})。
那么我们需要求的就是(sumlimits_{i=0}^n inom{n}{i}[2 mid (k-i)] inom{frac{k-i}{2} + n + m - 1}{n + m - 1})。因为(frac{inom{n}{i+1}}{inom{n}{i}} = frac{n-i}{i+1}),(frac{inom{n}{i}}{inom{n-1}{i}} = frac{n}{n-i}),所以可以从小到大枚举(i)的过程中动态维护这两个组合数。