UVa 11806 Cheerleaders(计数问题)
思路:
1.设情况A第一行没有拉拉队员,情况B最后一行没有拉拉队员,情况C第一列没有拉拉队员,情况D最后一列没有拉拉队员;
2.每种情况只有0
和1
两种取值,我们将它们排列,就可以用二进制0000~1111
来表示这种情况;
3.当然了,情况是会重复的,如下图;(设全集为S)
4.此时我们可以观察到这四种情况,重叠的层数为偶数的我们就将它加上,为奇数就减去,就可以正好得到
S-(A U B U C U D)
这个集合了;
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxk=500;
const int mod=1000007;
int C[maxk+10][maxk+10];
void init_(){
C[0][0]=1;
for(int i=1;i<=maxk;i++){
C[i][0]=1;
for(int j=1;j<=i;j++) C[i][j]=(C[i-1][j]+C[i-1][j-1])%mod;
}
}
void solve(){
int m,n,k,sum=0;
cin>>m>>n>>k;
for(int s=0;s<16;s++){
int r=m,c=n,ans=0;
if(s&1) r--,ans++;
if(s&2) r--,ans++;
if(s&4) c--,ans++;
if(s&8) c--,ans++;
if(ans&1) sum=(sum-C[r*c][k]+mod)%mod;
else sum=(sum+C[r*c][k])%mod;
}
cout<<sum<<'\n';
}
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL);
// freopen("Arutoria.txt","r",stdin);
init_();
int t; cin>>t;
for(int kase=1;kase<=t;kase++){
cout<<"Case "<<kase<<": ";
solve();
}
return 0;
}