你有一个n×m的网格图,现在你要将K个人放在网格中,满足一下条件:
-
网格图的四个边都至少有一个人。
-
每个格子上不能有两个人。
-
每个人必须都有位置。
注意:四个角的人可以同时算作在两个边上
容斥原理

J=0 时就是 allAnswer
#include <iostream>
#include <cstring>
#include <sstream>
using namespace std;
const int N=600;
const int mod =1e6+7;
int c[N][N],n,m,K;
void init(){
int i,j;
c[1][1]=1;
for(i=0;i<=500;i++) c[i][0]=1;
for(i=2;i<=500;i++)
for(j=1;j<=i;j++)
c[i][j]=(c[i-1][j]+c[i-1][j-1]),c[i][j]%=mod;
}
// j=0 全集
void sov(int cas){
int i,j;
cin>>n>>m>>K;
int ans= 0;
for(j=0;j<(1<<4);j++){
int cnt=0,x=n,y=m;
for(i=0;i<4;i++)
if(j&(1<<i)){
cnt++;
if(i==0) --x; if(i==1) --x; if(i==2) --y;
if(i==3) --y;
}
if(cnt%2==0) ans+=c[x*y][K],ans%=mod;
else ans=(ans-c[x*y][K]+mod)%mod;
}
printf("Case %d: %d\n",cas,ans);
}
signed main(){
init();
int cas=0,tes;
cin>>tes;
while(tes--)
sov(++cas);
}
浙公网安备 33010602011771号