UVa 11806 Cheerleaders

原创 2016年06月01日 08:46:24


来源:《算法竞赛训练指南》例题2-3、UVa 11806
题目描述:
m行n列矩形网格放k个【相同】石子,四条边界都要放,问有多少种放法。
题目分析:
要放比较麻烦,因为不知道具体放在那条边的哪一格上;相比之下不放就简单得多了,只要在考虑放置方法时无视该边即可。由此想到用容斥原理解题。
设 A:第一行没放石子的方案数;B:最后一行没放石子的方案数;C(注意与下面组合数符号区分):第一列没放石子的方案数;D:最后一列没放石子的方案数;S为没有限制的方案数。则最终要求的是

|ABCD|=S|ABCD|

用容斥原理展开即可计算,注意正负号。
具体编程实现时可以用杨辉三角递推法事先算出可能用到的组合数,对于容斥原理哪个【容】哪个【斥】,可以用位串来简单枚举选取的集合, state = 0 时对应全集S的情况。
哦对了,a行b列的矩形网格里放K块相同石子的放法显然是Ckab种。

//  Created by wander on 16/6/1.
//  Copyright © 2016年 W4anD0eR96. All rights reserved.
//  UVa 11806 Cheerleaders
//  类型:组合数学-容斥原理

#include "bits/stdc++.h"
using namespace std;

const int MOD = 1000007;
int kase, C[505][505];

void Init() { // 计算组合数{ C_i^j },杨辉三角递推
  for (int i = 0; i < 505; i += 1) {
    C[i][0] = C[i][i] = 1;
    for (int j = 1; j < i; j += 1)
      C[i][j] = (C[i - 1][j - 1] + C[i - 1][j]) % MOD;
  }
}

int main() {
#ifdef DEBUG
  freopen("in", "r", stdin);
  freopen("out", "w", stdout);
#endif
  Init();
  scanf("%d", &kase);
  for (int nCase = 1; nCase <= kase; nCase += 1) {
    int n, m, k, res = 0;
    scanf("%d%d%d", &n, &m, &k);
    for (int state = 0; state < 16; state += 1) {
      int cnt = 0, r = n, c = m;
      if (state & 1) { cnt += 1; r -= 1; }
      if (state & 2) { cnt += 1; r -= 1; }
      if (state & 4) { cnt += 1; c -= 1; }
      if (state & 8) { cnt += 1; c -= 1; }
      if (cnt & 1) res = (res + MOD - C[r * c][k]) % MOD;
      else res = (res + C[r * c][k]) % MOD;
    }
    printf("Case %d: %d\n", nCase, res);
  }
  return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Cheerleaders UVA - 11806(容斥原理)题解

Cheerleaders UVA - 11806(容斥原理)题解

uva11806 Cheerleaders

容斥原理
  • sdfzyhx
  • sdfzyhx
  • 2016年12月25日 15:36
  • 92

UVa 11806 Cheerleaders (组合&逆向思维||容斥定理)

【题意】 在一个n*m的区域内放k个棋子,第一排,最后一排,第一列,最后一列一定要放,求一共有多少种方法。 【思路】 正着想重复的情况太多,不妨反着思考。 设ai表示有且仅有i条边上没有放的情况数,...

UVA 11806 Cheerleaders(容斥原理 + 组合数)

传送门 In most professional sporting events, cheerleaders play a major role in entertaining the specta...

UVA 11806 Cheerleaders(容斥原理)(组合数)

参考了两篇博客,并摘抄了里面的部分解释 AOQNRMGYXLMV Yan_Bin     此题目是用的容斥原理,设第一行没有石子的方法数为A,最后一行没有石子的方法数为B,第一列没有石子的方法数...

UVA - 11806 - Cheerleaders (递推)

UVA - 11806 Cheerleaders Time Limit: 2000MS Memory Limit: Unknown 64bit IO Format: %ll...

UVA 11806 Cheerleaders (容斥原理+二进制枚举)

UVA 11806 Cheerleaders (容斥原理+二进制枚举) :http://acm.hust.edu.cn/vjudge/contest/view.action?cid=110771#pr...
  • PNAN222
  • PNAN222
  • 2016年04月02日 21:48
  • 269

UVA 11806 Cheerleaders

刘汝佳《训练指南》里的一道例题。典型的容斥原理的应用。设C(M*N,K)为在M行,N列里放K个数的方案数。因为要求第一列,最后一列,第一行,最后一行都有放置,显然答案为: C(M*N,K)-(2*C...

UVAoj 11806 - Cheerleaders

题解: 1.汝佳哥容斥的漂亮 2.我是分情况讨论的,所有情况抛去有一条(行或者列)没有石子的,再抛去两条,三条,和四条的 总结: 1.除了那些特别有把握的题目以外,都要尝试一些小的数据。 2...

容斥+二进制UVA 11806

问题是求四个边都有队员的排列组合,根据容斥原理可以转化为对立问题的求解: 全集为S=C(n*m,k), 该区域有k个队员的全部排列组合,|A|=最左边没有队员的全部种数,|B|=最右边没有,|C|=最...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:UVa 11806 Cheerleaders
举报原因:
原因补充:

(最多只允许输入30个字)