UVA 11806 容斥原理
2016-08-08 09:52
323 查看
题意:
往一个n*m的方格里放k个石块,问有多少种方式
最后一行,最后一列,第一行,第一列必须放至少一个
思路:
简单容斥一下
最后一行不放为事件r1,最后一列c1,第一行r2,第一列c2
全部情况-c1-c2-r1-r2+c1*c2+r1*r2+c1*r1+c1*r2…..
二进制枚举一下,奇加偶减
往一个n*m的方格里放k个石块,问有多少种方式
最后一行,最后一列,第一行,第一列必须放至少一个
思路:
简单容斥一下
最后一行不放为事件r1,最后一列c1,第一行r2,第一列c2
全部情况-c1-c2-r1-r2+c1*c2+r1*r2+c1*r1+c1*r2…..
二进制枚举一下,奇加偶减
#include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> #include<math.h> #include<queue> #include<stack> #include<string> #include<vector> #include<map> #include<set> using namespace std; #define lowbit(x) (x&(-x)) typedef long long LL; const int maxn = 505; const int inf=(1<<28)-1; const LL MOD = 1000007; int C[maxn][maxn]; void GetC() { C[0][0]=1; for(int i=1;i<maxn;++i) { C[i][0]=1; for(int j=1;j<=i;++j) { C[i][j]=(C[i-1][j]+C[i-1][j-1])%MOD; } } } int main() { GetC(); int T,Case=0; scanf("%d",&T); while(T--) { int n,m,k; scanf("%d%d%d",&n,&m,&k); LL Ans=0; for(int i=0;i<16;++i) { int step=0,r=n,c=m; if(i&1) { step++; r--; } if(i&2) { step++; r--; } if(i&4) { step++; c--; } if(i&8) { step++; c--; } if(c<0||r<0) continue; if(step&1) Ans=(Ans-C[c*r][k]+MOD)%MOD; else Ans=(Ans+C[c*r][k])%MOD; } printf("Case %d: %lld\n",++Case,Ans); } return 0; }
相关文章推荐
- uva 11806 - Cheerleaders(容斥原理)
- uva11806(容斥原理)
- UVA 11806 Cheerleaders(容斥原理)(组合数)
- UVa 11806 Cheerleaders (数论容斥原理)
- Cheerleaders UVA - 11806(容斥原理)题解
- UVA 11806 Cheerleaders (组合+容斥原理)
- UVA 11806 容斥原理
- UVa11806 Cheerleaders(容斥原理)
- UVA 11806 Cheerleaders (容斥原理)
- UVA 11806 - Cheerleaders (容斥原理)
- uva11806Cheerleaders--容斥原理
- UVa 11806 - Cheerleaders (组合数学 容斥原理)
- UVA 11806 Cheerleaders (容斥原理)
- UVa 11806 Cheerleaders / 容斥原理
- CheerLeaders Uva 11806(容斥原理)
- UVA 11806 Cheerleaders (容斥原理)
- Cheerleaders UVA - 11806(容斥原理)
- 【递推】【组合数】【容斥原理】UVA - 11806 - Cheerleaders
- UVA11806 容斥原理
- UVA 11806(B)——Cheerleaders 容斥原理 离散数学列举所有情况