题意:在n*m(n行m列)的棋盘里放石头,第一行,第一列,最后一行,最后一列至少要有一个石头,所给的k个石头必须要全部用完,问:有放石头的方式的种类数。
题解:容斥原理,如果把石头全部放进去种类数就是C(n*m,k);
所以题目所求的就是全部放进去的种类数减去不满足条件的种类数;
全集S=C(n*m, k)
A表示第一行不放的方案集合
B表示最后一行不放的方案集合
C表示第一列不放的方案集合
D表示最后一列不放的方案集合
那么答案就是 { S - { A U B U C U D } };
就是求 A∪B∪C∪D = |A|+|B|+|C|+|D| - |A∩B| - |B∩C| - |C∩A|- |A∩D| - |B∩D| - |C∩D|+|A∩B∩C|+|A∩B∩D| +|A∩C∩D| +|B∩C∩D| -|A∩B∩C∩D|
#include<iostream>
using namespace std;
const int mod=1e6+7;
long long n,m,k;
long long c[510][510];
void init()//将组合数保存起来
{
for(int i=0;i<=505;i++)
{
c[i][0]=1;
c[i][i]=1;
}
c[1][1]=1;
for(int i=2;i<=505;i++)
for(int j=1;j<i;j++)
{
c[i][j]=(c[i-1][j-1]+c[i-1][j]+mod)%mod;
}
}
int main()
{
int t;
init();
cin>>t;
for(int i=1;i<=t;i++)
{
long long ans;
cin>>n>>m>>k;
ans=((c[n*m][k]-(2*c[(n-1)*m][k]+2*c[(m-1)*n][k]-(4*c[n*m-m-n+1][k]+c[n*m-2*n][k]+c[n*m-2*m][k])+2*c[n*m-m-2*n+2][k]+2*c[n*m-n-2*m+2][k]-c[n*m-2*m-2*n+4][k]))+mod)%mod;
cout<<"Case "<<i<<": "<<(ans+mod)%mod<<endl;
}
return 0;
}