n*m的矩形 k个人 第一行,最后一行,第一列,最后一列都至少站有一个人
小水题
正着做不好做,要反着想,那就容斥定理,ABCD四种情况分别是那四个行列分别没有人。
1 #include<cstdio> 2 #include<cstdlib> 3 #include<cstring> 4 #include<iostream> 5 using namespace std; 6 7 const int mod=1000007; 8 const int K=500; 9 10 int c[510][510]; 11 12 int main() 13 { 14 //freopen("a.in","r",stdin); 15 memset(c,0,sizeof(c)); 16 c[0][0]=1; 17 for(int i=1;i<=K;i++) 18 { 19 c[i][0]=c[i][i]=1; 20 for(int j=1;j<i;j++) 21 c[i][j]=(c[i-1][j]+c[i-1][j-1])%mod; 22 } 23 int T; 24 scanf("%d",&T); 25 for(int TT=1;TT<=T;TT++) 26 { 27 int n,m,k,ans=0; 28 scanf("%d%d%d",&n,&m,&k); 29 for(int s=0;s<(1<<4);s++) 30 { 31 int nn=n,mm=m,sum=0; 32 if(s&(1<<0)) nn--,sum++; 33 if(s&(1<<1)) mm--,sum++; 34 if(s&(1<<2)) nn--,sum++; 35 if(s&(1<<3)) mm--,sum++; 36 if(sum&1) ans=(ans-c[nn*mm][k]+mod)%mod; 37 else ans=(ans+c[nn*mm][k])%mod; 38 } 39 printf("Case %d: %d\n",TT,ans); 40 } 41 return 0; 42 }