容斥原理简单运用
代码如下:
#include <cstdio>
#include <cstring>
using namespace std;
const int mod = 1e6+7;
const int maxk = 510;
int c[maxk][maxk];
void init(){
memset(c,0,sizeof(c));
c[0][0] = 1;
for (int i=0; i<maxk; i++){
c[i][0] = c[i][i] = 1; //边界条件
for (int j=1; j<i; j++) c[i][j] = (c[i-1][j]+c[i-1][j-1])%mod;
}
}
int n,m,k;
int main(){
init();
int T,kase = 0;
scanf("%d",&T);
while (T--){
scanf("%d %d %d",&n,&m,&k);
int sum = 0;
for (int i=0; i<16; i++) {
int num = 0, r=n,col=m; //num集合个数,r行数,col列数
if (i&1) {num++; r--;}
if (i&2) {num++; r--;}
if (i&4) {num++; col--;}
if (i&8) {num++; col--;}
if (num&1) sum = (sum+mod-c[r*col][k])%mod; //奇数个集合减法
else sum = (sum+c[r*col][k])%mod; //偶数个集合加法
}
printf("Case %d: %d\n",++kase,sum);
}
return 0;
}