题目:Cheerleaders
思路:
容斥原理。
考虑全部的方案数减去边上没有的方案数。
可以预处理组合数。
二进制状压可以简化代码。
代码:
#include<bits/stdc++.h>
using namespace std;
#define read(x) scanf("%d",&x)
#define maxk 500
#define md ((int)(1e6+7))
int n,m,k;
int c[maxk+5][maxk+5];
int main() {
int T;
read(T);
for(int i=0;i<=maxk;i++) {
c[i][0]=c[i][i]=1;
for(int j=1;j<i;j++) {
c[i][j]=((long long)c[i-1][j-1]+c[i-1][j])%md;
}
}
int Case=0;
while(T--) {
int ans=0;
read(n),read(m),read(k);
for(int i=0;i<16;i++) {
int b=0,nn=n,mm=m;
if(i&1) nn--,b++;
if(i&2) nn--,b++;
if(i&4) mm--,b++;
if(i&8) mm--,b++;
if(b&1) ans=(ans-c[nn*mm][k]+md)%md;
else ans=((long long)ans+c[nn*mm][k])%md;
}
printf("Case %d: %d\n",++Case,ans);
}
return 0;
}