UVa 11806 Cheerleaders(计数问题)

思路:

1.设情况A第一行没有拉拉队员,情况B最后一行没有拉拉队员,情况C第一列没有拉拉队员,情况D最后一列没有拉拉队员;
2.每种情况只有01两种取值,我们将它们排列,就可以用二进制0000~1111来表示这 16 16 16种情况;
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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值