AGC021F Trinity【计数,NTT】

很久没写博客了,诈个尸(

题目描述:有一个 (n)(m) 列的黑白表格,定义一个映射 (f:{0,1}^{n imes m} ightarrow ({A_n},{B_m},{C_m})),其中 (A_i) 为第 (i) 行第一个黑格的列号(不存在则为 (m+1)),(B_i) 为第 (i) 列第一个黑格的行号(不存在则为 (n+1)),(C_i) 为第 (i) 列最后一个黑格的行号(不存在则为 (0)),求 (f) 的值域大小。

数据范围:(nle 8000,mle 200)

我们设 (f_{i,j}) 表示 (i imes j) 的表格中,每行都有数的答案,那么 (Ans=sum_{i=0}^ninom{n}{i}f_{i,j})

然后考虑dp,若当前列不新增行,那么 (f_{i,j}(1+i+inom{i}{2}) ightarrow f_{i,j+1})

如果新增行呢?这就是一个很神奇的思路了。考虑 (B_{j+1}-1,C_{j+1}+1) 和新增的 (k) 行共 (k+2) 行,需要在共 (i+k+2) 行中选出来它们的位置,就是 (inom{i+k+2}{i}),综上dp方程就是

[f_{i,j}=(inom{i+1}{2}+1)f_{i,j-1}+(i+2)!sum_{k=0}^{i-1}frac{f_{k,j-1}}{k!}frac{1}{(i+2-k)!} ]

使用 NTT 优化,时间复杂度 (O(nmlog n))

code

原文地址:https://www.cnblogs.com/AThousandMoons/p/12589281.html