题目链接
做法
先考虑$k=0$的部分分。
发现$x,y$这两维有一定的独立性,先分开考虑。
我们以$calc(x,y,z)$表示跳$z$步,每步不超过$y$格,总共跳了$x$格的方案数,直接dp复杂度为$O(10^6)$不能接受,考虑容斥。
先以$g_i$表示至少有i步超过了$y$格的方案数。
我们从$z$步中选择$i$步先跳$y+1$格,剩下的话插板法解决。
用$f_i$表示恰好有$i$步超过了$y$格的方案数,二项式反演即可。
$calc(x,y,z)$所求答案即为$f_0$
但是两维并不完全独立,因为题目规定了不能两维上同时在一步上跳$0$格。
$g_i$表示至多走了$i$步的方案(两维上都跳0格不算一步)。
$g_i=calc(tx,mx,z)*calc(ty,my,z)$
$f_i$表示恰好走了$i$步的方案。
再次二项式反演
这样我们就解决了$k=0$的部分分
再考虑有k的限制。
温馨提示:先把k去重
$g_i$表示至少有$i$步违反限制的方案数
先$dp$出$f_{i,j}$表示$i$步违反限制,总格数为$G*j$的方案数,$j$最大只有100,可以轻松dp出。
那么计算$g_i$的时候,先枚举这$i$步总共跳了多少格,剩下的步数可以转化成一个$k=0$的问题。
有了$g$后,剩下的反演就和第一步一模一样了。
复杂度为$O(1000*1000*100*100)$,发现前面calc需要计算的值不多,记忆化后可以去掉一个1000,就解决了此题。
代码
1 |
|