Light OJ 1246 Colorful Board (棋盘黑白染色+数学)
2016-02-15 10:54
337 查看
解析:将矩形黑白染色,则根据题意,黑格和白格不能有同色出现。所以K种颜色有了三种划分,一是染了某个黑格,二是染了某个白格,三是没有使用。
如果有i种颜色染黑格,则方案数等价于 n个不同的物品放入m个不同的箱子,箱子非空的方案数(Strling(n,m)*m!)。
如果有i种颜色染黑格,则方案数等价于 n个不同的物品放入m个不同的箱子,箱子非空的方案数(Strling(n,m)*m!)。
: [code]#include<cstdio> #include<cstring> #include<algorithm> using namespace std; typedef long long LL; const LL MOD = 1e9+7; int n,m,k; LL C[205][205],S[205][205],mul[205]; void init(){ int i,j; S[0][0] = 1; mul[0] = 1; C[0][0] = 1; for(i = 1;i <= 500;i++){ mul[i] = (mul[i-1]*i)%MOD; S[i][0] = 0; S[i][1] = S[i][i] = 1; for(j = 2;j < i;j++) S[i][j] = (S[i-1][j-1]+j*S[i-1][j])%MOD; C[i][0] = C[i][i] = 1; for(j = 1;j < i;j++) C[i][j] = (C[i-1][j]+C[i-1][j-1])%MOD; } } LL mod_pow(LL a,LL b){ LL res = 1; if(a==0||b==0) return 1; while(b){ if(b&1) res = (res*a)%MOD; a = (a*a)%MOD; b >>= 1; } return res; } int main(){ int i,j,cas,T; init(); scanf("%d",&cas); for(T = 1;T <= cas;T++){ scanf("%d%d%d",&n,&m,&k); n++,m++; LL tmp1,tmp2,ans = 0; int t1,t2; t1 = t2 = n*m/2; if((n&1)&&(m&1)) t1++; for(i = 0;i <= k;i++){ tmp1 = (C[k][i]*mul[i]%MOD)*S[t1][i]%MOD; for(j = 0;j <= k-i;j++){ tmp2 = ((tmp1*C[k-i][j]%MOD)*mul[j]%MOD)*S[t2][j]%MOD; ans = (ans + tmp2)%MOD; } } printf("Case %d: %lld\n",T,ans); } return 0; }
相关文章推荐
- android测试工具小总结
- 关于struts漏洞
- webdriver学习
- Service里面的onStartCommand()方法详解
- 如何关闭log4j中配置的spring或者hibernate的日志信息
- CSS3阴影 box-shadow的使用和技巧总结
- 什么是aop?
- oracle 时间函数操作
- 给 Android 开发者的 RxJava 详解
- 网络---使用curl命令排查网络问题小结
- AndroidAnnotations
- 20160215年记录
- 音频 API 一览
- 解读JAVA 的ClassLoader
- Java类的创建时的静态和非静态的初始化顺序
- xml的一些笔记
- [置顶] unity中对象池的使用
- dex文件结构
- BZOJ 4278: [ONTAK2015]Tasowanie|后缀数组|贪心
- new和delete