首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【周练3016.3.5】QAQ的问题(排列与组合,好题)

【周练3016.3.5】QAQ的问题(排列与组合,好题)

作者头像
FishWang
发布2025-08-27 08:45:17
发布2025-08-27 08:45:17
1050
举报

QAQ的问题

时间限制: 1 Sec 内存限制: 128 MB 提交: 11 解决: 3 [ 提交][ 状态][ 讨论版]

题目描述

有M个不同的阵地,每个阵地上可以留守任意个士兵(为非负数)。现在QAQ有N个士兵,他需要选择至少一个阵地才可以获得胜利。QAQ的一贯原则——让所有士兵留守在他选择的阵地上。问有多少种安排方案使得QAQ获得胜利。为了降低难度,QAQ在选择的阵地上不留守士兵也是合法的。

方案数的不同判定只能依据下面条: (1)选择的阵地数目不同 ——选择1个阵地和选择2个阵地。 (2)选择的阵地不同 ——选择阵地1、2和选择阵地2、3。 (3)在选择的阵地中任意两个阵地留守士兵数目不同 ——阵地1有a人、阵地2有b人;阵地1有c人、阵地2有d人。其中a != c || b != d 且a、b、c、d均为非负数。

举个例子:有2个士兵和2个阵地,方案数为5。 (1)选择1个阵地方案数为2 —— 选择阵地1并留守2个士兵 或者 选择阵地2并留守2个士兵。 (2)选择2个阵地方案数为3 —— 在阵地1、2留守士兵人数为0 2、2 0、1 1。 这里要注意:不能依据每个阵地的人数来判定(1)里面的方案2 !0、!0 2和(2)的2 0、 0 2重复,因为前提选择的阵地数目不同。

输入

有多组测试数据,请处理到文件结束。

每组数据给定两个整数N和M,分别表示士兵人数和阵地数目。1 <= N, M <= 50。

输出

每组数据输出一个整数表示不同的方案数。由于结果可能很大,你只需要输出 % 777的结果。

解释一下,如果最后结果为777,你只需要输出777 % 777 = 0。

样例输入

代码语言:javascript
复制
2 2
46 37
1 1

样例输出

代码语言:javascript
复制
5
0
1

首先说一下这次比赛遇到这道题的情况,刚开始碰上没把这道题和分书问题联系起来,自己总结整理了一大堆繁琐的公式,结果无法化简,没法做了。

这道题有几个知识点要注意:

1.排列与组合数的生成。我以前发过一个排列与组合的计算,但是这道题用起来并不好,在这里写的是学长教的打表方法。

2.就是分书问题的思路:

①n本书分给m个人。这是高中印象深刻的一道题了,n个人一字排好,向中间插隔板,就是 C(n-1,m-1)

②n本书分给m个人,但是可以有人不分到书。是 C(n+m-1,m-1)

好了,有了这两个知识点,下面代码就好写了,注意同余定理的使用。

代码如下:

代码语言:javascript
复制
#include <cstdio>
#include <cstring>
#define MOD 777
int c[111][111];
void C()
{
	for (int i=0;i<=100;i++)
		c[i][0]=1;
	for (int i=1;i<=100;i++)
	{
		for (int j=1;j<=i;j++)
			c[i][j]=(c[i-1][j-1]+c[i-1][j]) % MOD;
	}
}
int main()
{
	int n,m;
	C();
	while (~scanf ("%d %d",&n,&m))
	{
		int ans=m;
		for (int i=2;i<=m;i++)
			ans=(ans+c[n+i-1][i-1]*c[m][i]%MOD)%MOD;
		printf ("%d\n",ans);
	}
	return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016-03-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • QAQ的问题
  • 题目描述
  • 输入
  • 输出
  • 样例输入
  • 样例输出
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档