【BZOJ4487】[JSOI2015]染色问题(容斥)

题面

BZOJ

题解

看起来是一个比较显然的题目?

首先枚举一下至少有多少种颜色没有被用到过,然后考虑用至多\(k\)种颜色染色的方案数。

那么显然没有颜色的限制,只有行列的限制。

那么我们钦定行必须被染色,这样子每一行的染色方案之和列数和颜色数相关,那么再容斥一下有多少列没有被染色就行了。

#include<iostream>
#include<cstdio>
using namespace std;
#define MAX 444
#define MOD 1000000007
inline int read()
{
int x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
int fpow(int a,int b){int s=1;while(b){if(b&1)s=1ll*s*a%MOD;a=1ll*a*a%MOD;b>>=1;}return s;}
int n,m,c,ans,C[MAX][MAX];
int Calc(int c)
{
int ret=0;
for(int i=0,d=1;i<=m;++i,d=MOD-d)
{
int v=fpow(c,m-i)-1;
ret=(ret+1ll*d*fpow(v,n)%MOD*C[m][i])%MOD;
}
return ret;
}
int main()
{
n=read();m=read();c=read()+1;
for(int i=0;i<MAX;++i)C[i][0]=1;
for(int i=1;i<MAX;++i)
for(int j=1;j<=i;++j)
C[i][j]=(C[i-1][j]+C[i-1][j-1])%MOD;
for(int i=0,d=1;i<c;++i,d=MOD-d)ans=(ans+1ll*d*Calc(c-i)%MOD*C[c-1][i]%MOD)%MOD;
printf("%d\n",ans);
return 0;
}

最新文章

  1. 索引中include的魅力(具有包含性列的索引) (转)
  2. 15个nosql数据库
  3. grunt让Nodejs规范起来
  4. Environment Variables
  5. 修改 Ueditor 默认显示的字体大小
  6. 异步导出excel
  7. CSS水平导航条和纵向导航条
  8. php学习日志(1)-php介绍
  9. iis5.1/6.0/7.0+ 配置url重写 无扩展名伪静态
  10. svcutil 生成代理类时的问题
  11. Delphi:窗体自适应屏幕分辨率(根据预设值的比例改变)
  12. Sql CE 数据库编程
  13. binary
  14. HelloWorld改编,仿bilibili手机端(一)——侧滑菜单界面布局
  15. 浅析java内存管理机制
  16. 循环神经网络(RNN)--学习笔记
  17. pm2管理node
  18. js获取http请求响应头信息
  19. 重温httpsession①
  20. Tomcat项目部署问题记录

热门文章

  1. SharpGL之透视投影和摄像机
  2. maven 学习---Maven 构建配置文件
  3. Android系统源码目录
  4. JMETER 使用随机变量
  5. Eyoo大学生交友平台
  6. 两种方式实现浅拷贝 for in实现和Object.assign({}, 对象1, 对象2);
  7. Flask框架之功能详解
  8. 如何防止XSS攻击?
  9. c# 第五节 第一个控制台程序、第一个桌面、快捷键、注释
  10. c# 第四节 Net Framework编写应用程序的过程