题目:
CodeForces - 1228E:Another Filling the Grid
题意:
给定一个 N x N 的网格,每个格子必须要填一个【1,K】之间的数,问有多少种不同的填法使得每行每列的最小值都是 1 ?
分析:
不会dp,只会容斥的做法
如果不考虑限制,总的方案数就是 ,只需要减去不满足限制的方案数就是答案,也就是至少有一行或至少有一列的最小值不为 1 的方案数;设 Ai 为第 i 行最小值不为 1 的填法的集合,Bi 为第 i 列的最小值不为 1 的填法的集合,那么 Ai 和 Bi 的并集就是不合法的方案数,这个用容斥公式直接计算即可
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn = 600;
const int mod = 1e9+7;
LL qpow(LL a,LL x){
LL res = 1ll;
while(x){
if(x&1) res = res*a%mod;
a = a*a%mod;