一个很套路的容斥裸题,这里记录一下scb 的切题过程

Description

  有一个 \(n\times n\) 的矩阵,你需要往每格里填一个 \([1,k]\) 的整数,使得每一行、每一列的最小值都是 \(1\)。求方案数。

  \(n\le 250\)

  \(k\le 10^9\)

Solution

  这题可以 \(O(n)\) 做……不知道这数据范围是什么鬼……

  考虑消除掉一维影响后容斥。

  预处理一个函数 \(f(i)\) 表示填满 \(i\times n\) 的网格,满足每一列填了至少一个 \(1\) 的方案数。

  显然 \(f(0)=0\),\(f(i) = (k^i - (k-1)^i)^n\),\(k^i - (k-1)^i\) 表示任意填充一列的方案数 减去这一列没有 \(1\) 的方案数,那么这一列就至少有一个 \(1\) 咯。

  下面所有统计的情况都是满足列限制的。我们考虑对行限制容斥,用总方案数减去不合法的方案数。

  即

\(\begin{align} ans = &不对行作限制的方案数 - 第 1 行没有 1 的方案数 - 第 2 行没有 1 的方案数 - 第 3 行没有 1 的方案数 - \cdots \nonumber \\ &- 第 n 行没有 1 的方案数 + 第 1,2 行没有 1 的方案数 + 第 1,3 行没有 1 的方案数 +\cdots \nonumber \end{align}\)

  即 \(ans = \sum\limits_{i=0}^n (-1)^i C_n^i (k-1)^{ni} f(n-i)\)

  解释一下,就是钦定 \(i\) 行不能有 \(1\)(显然有 \(C_n^i\) 种钦定方案),然后填充其余 \(n-i\) 行的条件是每一列上都有 \(1\)。

  \(O(n)\) 计算即可。

  还有一道配套容斥题,但并不能公开。

#include<bits/stdc++.h>
#define ll long long
#define N 251
#define mod 1000000007
using namespace std;
inline int read(){
int x=0; bool f=1; char c=getchar();
for(;!isdigit(c); c=getchar()) if(c=='-') f=0;
for(; isdigit(c); c=getchar()) x=(x<<3)+(x<<1)+(c^'0');
if(f) return x; return 0-x;
}
int n,k,f[N],fac[N],ifac[N],ans;
int Pow(int x, int y){
int ret=1;
while(y){
if(y&1) ret=(ll)ret*x%mod;
x=(ll)x*x%mod;
y>>=1;
}
return ret;
}
inline int C(int n, int m){
return (ll)fac[n] * ifac[m] % mod * ifac[n-m] % mod;
}
inline void upd(int &x, int y){
x = (x+y) % mod;
}
int main(){
n=read(), k=read();
fac[0]=1;
for(int i=1; i<=n; ++i){
f[i] = Pow((Pow(k,i)-Pow(k-1,i)+mod)%mod, n),
fac[i] = (ll)fac[i-1] * i % mod;
}
ifac[n] = Pow(fac[n], mod-2);
for(int i=n-1; i>=0; --i) ifac[i] = (ll)ifac[i+1] * (i+1) % mod;
for(int i=0; i<=n; ++i) upd(ans, ((i&1)?mod-1ll:1ll) * C(n,i) % mod * Pow(k-1,(ll)n*i) % mod * f[n-i] % mod);
cout<<ans<<endl;
return 0;
}

最新文章

  1. OI省选算法汇总
  2. request 获取服务根目录地址
  3. 161226、js日期格式化
  4. Apache配置--用户认证(针对目录访问)-update2015-05-02
  5. ThinkPHP缓存微信公众号access_token
  6. js两种创建对象方式
  7. A9.linux驱动
  8. 【python自动化第十篇:】
  9. winfrom面向对象1
  10. Linux双网卡NAT共享上网
  11. python 模块:xlrd &amp;&amp; xlwt
  12. SQL - for xml path(&#39;&#39;) 实现多行合并到一行, 并带有分隔符
  13. 【Atcoder Grand Contest 011 F】Train Service Planning
  14. 通过Ajax方式上传文件(input file),使用FormData进行Ajax请求
  15. 14. Redis配置统计字典
  16. GNU C 与 ANSI C(上)
  17. ida信息获取函数
  18. 纯真ip导入mysql
  19. Python虚拟开发环境pipenv
  20. 074——VUE中vuex之模块化modules开发实例

热门文章

  1. 奇妙的算法【4】-汉诺塔&amp;哈夫曼编码
  2. opencv-04--图像金字塔
  3. VUE CLI3 less 全局变量引用
  4. 1 vue 关键字解释
  5. 4.解析配置文件 redis.conf
  6. 【shell】shell基础
  7. 猫眼 top_100 爬取 ___只完成了第一页
  8. CentOS7安装CDH 第四章:CDH的版本选择和安装方式
  9. php+redis一步一步测试秒杀
  10. NLP传统基础(3)---潜在语义分析LSA主题模型---SVD得到降维矩阵