题目描述
求出满足以下条件的$n*m$的$01$矩阵个数:
(1)第$i$行第$1~l_i$列恰好有$1$个$1$。
(2)第$i$行第$r_i~m$列恰好有$1$个$1$。
(3)每列至多有$1$个$1$。
输入格式
第一行两个整数$n,m$。接下来$n$行每行$2$个整数$l_i,r_i$。
输出格式
一行一个整数表示答案。对998244353取模。
样例
样例输入
2 6
2 4
5 6
样例输出
12
数据范围与提示
对于$20%$的数据,$n,m\leqslant 12$。
对于$40%$的数据,$n,m\leqslant 50$。
对于$70%$的数据,$n,m\leqslant 300$。
对于$100%$的数据,$n,m\leqslant 3000$,$1\leqslant l_i<r_i\leqslant m$。
题解
看到这道题,首先应该想到组合数,然后……
我一开始想的是容斥,正好能模过样例,但是忽然发现是一个多步容斥,无语……
$20%$算法:
使劲搜就好了,别搜错了,记得别用clock(),递归函数里clock()返回值玄学(考场上被这东西干没了40分……)。
$100%$算法:
考虑$DP$,定义有点意思,定义$dp[i][j]$表示当前到了第$i$列,已经有$j$列在右侧区间放$1$的方案数。
下面来解释一下,注意右侧区间不是第$i$列的右侧,而是$r_i$,理解这东西我用了半个小时……
下面在来看一下如何转移: