逐个去除限制。第四个限制显然可以容斥,即染恰好c种颜色的方案数=染至多c种颜色的方案数-染至多c-1种颜色的方案数+染至多c-2种颜色的方案数……

  然后是限制二。同样可以容斥,即恰好选n行的方案数=至多选n行的方案数-至多选n-1行的方案数+至多选n-2行的方案数……

  限制三同理。即容斥套容斥套容斥。复杂度O(nmc)。

  注意到容斥式子和二项式定理有千丝万缕的联系,用二项式定理去掉一维变成O(nclogm)。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
int read()
{
int x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
#define N 410
#define P 1000000007
int n,m,c,ans,C[N][N];
void inc(int &x,int y){x+=y;if (x>=P) x-=P;}
int ksm(int a,int k)
{
int s=;
for (;k;k>>=,a=1ll*a*a%P) if (k&) s=1ll*s*a%P;
return s;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("bzoj4487.in","r",stdin);
freopen("bzoj4487.out","w",stdout);
const char LL[]="%I64d\n";
#else
const char LL[]="%lld\n";
#endif
n=read(),m=read(),c=read();
C[][]=;
for (int i=;i<=;i++)
{
C[i][]=C[i][i]=;
for (int j=;j<i;j++)
C[i][j]=(C[i-][j]+C[i-][j-])%P;
}
for (int i=c;i>=;i--)
for (int j=n;j>=;j--)
if ((c-i+n-j+m&)^(m&)) inc(ans,P-1ll*C[c][i]*C[n][j]%P*ksm(ksm(i+,j)-,m)%P);
else inc(ans,1ll*C[c][i]*C[n][j]%P*ksm(ksm(i+,j)-,m)%P);
cout<<ans;
return ;
}

最新文章

  1. Velocity初探小结--velocity使用语法详解
  2. Hangfire项目使用
  3. 第一章 Java的I/O演进之路
  4. Android Studio插件安装及使用Genymotion模拟器
  5. 多版本python共存
  6. guice的基本使用(一)
  7. 3500常用汉字与标点符号(已排除不支持GB2312的)
  8. python读取excel文件
  9. Sublime Text插件之Emmet
  10. hdu 5621 KK&#39;s Point(数学,推理题)
  11. 第五章SignalR的实时高频通讯
  12. php将文件夹打包成zip文件
  13. 常用的js事件
  14. 七个 Android 程序猿提高效率必备工具
  15. 如何利用Oracle VM Templates 在几分钟内部署Oracle Real Application Clusters (RAC)
  16. Android 5.x 权限问题解决方法
  17. python学习之——习题二
  18. JS,JQ及时监听input值的变化,MUI的input搜索框里的清除按钮的点击监听事件
  19. 【mysql】表备份
  20. Dell灵越 5559笔记本安装固态硬盘 BIOS设置

热门文章

  1. MHA实现mysql高可用复制集群
  2. canvas 制作表情包
  3. svg在html的使用
  4. (转)程序员新人怎样在复杂代码中找 bug?
  5. 构建ExtJS 6.x程序
  6. MySQL索引介绍
  7. php PHPEXcel导出
  8. Ubuntu设置代理服务器
  9. 嵌入式框架Zorb Framework搭建七:任务的实现
  10. 贪心算法之Huffman