hdu6314 容斥+数学
2024-10-09 05:05:47
题意 : n*m的矩阵 可以涂黑白两色 问至少A行B列为黑色的涂色方案种类数,答案对998244353取模,1<=n,m,A,B<=3000
题解: ans=sum{A,..n}sum(B,...m}*f[n-i][m-j] (i,j分别为前两个∑的迭代变量),f[a][b]表示a行b列中没有一行或者一列全部涂黑
由容斥定理 f[i][j]=sum{0,..i}sum{0,.j}*(-1)(a+b)*2(i-a)*(j-b) (a,b分别为前两个∑的迭代变量)。
代入得ans=sum{A,...n}sum{B,...m}sum{0,....n-i}sum{0,...m-j} n!m!(-1)a+b2(n-i-a)(m-j-b) /((n-i-a)!(m-j-b)!i!j!a!b!) (i,j,a,b)分别∑为的迭代变量
#include<cstdio>
using namespace std;
const int P=;
const int N=3e3+;
int e[N*N],fac[N],facn[N*N],pre[N][N],g[N][N];
inline int ksm(int x,int k){
int ans=;
for(;k;k>>=,x=1LL*x*x%P) if(k&) ans=1LL*ans*x%P;
return ans;
}
void init(){
int i,val;
for(e[]=i=;i<=;++i) e[i]=2LL*e[i-]%P;
for(fac[]=facn[]=i=;i<=;++i) fac[i]=1LL*i*fac[i-]%P,facn[i]=ksm(fac[i],P-);
for(int i=;i<=;++i) for(int j=i;j>=;--j) {
val=1LL*facn[j]*facn[i-j]%P;
if((i-j)&) val=P-val;
pre[i][j]=(val+pre[i][j+])%P;
}
for(int i=;i<=;++i) for(int j=;j<=;++j)
g[i][j]=1LL*e[i*j]*facn[i]%P*facn[j]%P;
}
int main(){
init();
int n,m,A,B;
while(~scanf("%d%d%d%d",&n,&m,&A,&B)){
int ans=;
for(int i=;i<=n-A;++i) for(int j=;j<=m-B;++j)
ans=(ans+1LL*pre[n-i][A]*pre[m-j][B]%P*g[i][j]%P)%P;
printf("%d\n",1LL*ans*fac[n]%P*fac[m]%P);
}
}
最新文章
- 对rxandroid的简单理解
- jpa 表字段转bean对象
- HTTP状态码分类说明
- IT人士感言2(转)
- NodeJS: 处理request网页乱码问题
- eclipse安装tomcate插件步骤
- RTT操作系统
- Linux按照时间查找文件
- sudo apt-get install gksu
- mybati之入门demo
- javaScript事件机制兼容【整理】
- Nginx学习之四-Nginx进程同步方式-自旋锁(spinlock)
- html = data.decode(&#39;gbk&#39;).encode(&#39;utf-8&#39;)
- JDK1.6官方下载
- windows任务设置定时
- TypeError: document.getELementById is not a function
- 部署activiti 5.15.1的Activiti Explorer
- 【BZOJ4883】 [Lydsy1705月赛]棋盘上的守卫(最小生成树,基环树)
- python requests上传文件 tornado 接收文件
- 部署WEB项目到服务器(二)安装tomcat到linux服务器(Ubuntu)详解