【u030】扑克牌
Time Limit: 1 second
Memory Limit: 128 MB
【问题描述】
组合数学是数学的重要组成部分,是一门研究离散对象的科学,它主要研究满足一定条件的组态(也称组合模型)的存在、计数以及构造等方面的问题。组合数学的主要内容有组合计数、组合设计、组合矩阵、组合优化等。 随着计算机科学的日益发展,组合数学的重要性也日渐凸显,因为计算机科学的核心内容是使用算法处理离散数据。 今天我们来研究组合数学中的一个有趣的问题,也是一个简单的计数问题: 从一副含有n(n≤10000)张的扑克牌[显然每张扑克牌都不相同]中,分给m(m≤100)个人,第i个人得到ai
(0≤ai≤100)张牌,求一共有几种分法,这个数可能非常大,请输出此数模10007后的结果。
【输入格式】
第一行两个整数 为 n m 第二行 m个整数 ai
【输出格式】
【数据规模】
Sample Input1
5 2
3 1
Sample Output1
20
Sample Input2
20 19
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
Sample Output2
8707
【题解】
这是一道组合的问题。
难点在组合数的求法(除法可没有同余率可以用!)。
设c[n][m]为从n个数中取m个数的排列。
则有递推关系c[n][m] = c[n-1][m-1] +c[n-1][m];
(杨辉三角)
然后再加上一句%10007即可。
边界条件是c[n][0] = 1;
c[n][n] = 1;
因为最多取100张牌,所以第二维只要开到101就可以了。
然后对于每一个人的需求ai;
答案先乘上c[n][ai],然后n-=ai;
n就变成剩余的纸牌数量了,然后重复上述乘法过程即可。
【代码】
#include <cstdio> int n, m,a[101];
int c[10001][101] = { 0 }; void init()
{
c[0][0] = 1;
for (int i = 1; i <= 10000; i++)//这是边界条件。
{
c[i][0] = 1;
if (i <= 100)
c[i][i] = 1;
}
for (int i = 1; i <= 10000; i++) //获得c[0..10000][0..100]
{
int to;
if (i < 100)
to = i;
else
to = 100;
for (int j = 1; j <= to; j++)//杨辉三角递推式。
c[i][j] = (c[i - 1][j] + c[i - 1][j - 1])%10007;
}
} int main()
{ init();
scanf("%d%d", &n, &m);
for (int i = 1; i <= m; i++)//输入n个需求量
scanf("%d", &a[i]);
__int64 temp = 1;
for (int i = 1; i <= m; i++)//对每一个需求量用组合原理进行乘法运算(分步相乘->分步来给扑克牌);
if (n >= a[i])
{
temp = (temp*c[n][a[i]])%10007;
n -= a[i];
}
else //如果不够分了,方案则为0.输出答案,结束程序。
{
temp = 0;
break;
}
printf("%I64d", temp);//输出答案。
return 0;
}
【u030】扑克牌的更多相关文章
- SCNU 2015ACM新生赛初赛【1007. ZLM的扑克牌】解题报告
题目链接详见SCNU 2015新生网络赛 1007. ZLM的扑克牌 . 其实我在想这题的时候,还想过要不要设置求最小的排列,并且对于回文数字的话,可以把扑克牌折起来( ...
- Java 用LinkdeList实现52张扑克牌
用LinkdeList实现52张扑克牌(不含大小王)的洗牌功能.提示:花色 ,和数字分别用数组存储. import java.util.LinkedList; import java.util.Ran ...
- C算法编程题(一)扑克牌发牌
前言 上周写<我的编程开始(C)>这篇文章的时候,说过有时间的话会写些算法编程的题目,可能是这两天周末过的太舒适了,忘记写了.下班了,还没回去,闲来无事就写下吧. 因为写C++的编程题和其 ...
- JAVA collection集合之 扑克牌游戏
主要内容:这里使用collection集合,模拟香港电影中大佬们玩的扑克牌游戏. 1.游戏规则:两个玩家每人手中发两张牌,进行比较.比较每个玩家手中牌最大的点数,大小由A-2,点数大者获胜.如果点数相 ...
- Java程序设计之扑克牌
这段代码的主要实现功能扑克牌的洗牌和发牌功能,一副牌,红桃,黑桃,梅花,方片,A~K,不含大小王. 构造一个class. 首先是声明花色: private String[] sign={"方 ...
- js运动框架之掉落的扑克牌(重心、弹起效果)
玩过电脑自带纸牌游戏的同志们应该都知道,游戏过关后扑克牌会依次从上空掉落,落下后又弹起,直至"滚出"屏幕. 效果如图: 这个案例的具体效果就是:点击开始运动,纸牌会从右上角掉 ...
- javascript练习-扑克牌
下面用枚举类型来实现一副扑克牌的类: //定义一个玩牌的类 function Card(suit,rank){ function inherit(p){ if(p==null) throw TypeE ...
- JavaScript学习笔记-实现枚举类型,扑克牌应用
//实现枚举类型,扑克牌应用 function creatEnum(p){ //构造函数 var Enumeration = function(){throw 'can not Ins ...
- 华为OJ题目:扑克牌大小
题目描述: 扑克牌游戏大家应该都比较熟悉了,一副牌由54张组成,含3~A.2各4张,小王1张,大王1张.牌面从小到大用如下字符和字符串表示(其中,小写joker表示小王,大写JOKER表示大王):3 ...
随机推荐
- ListCtrl添加右键菜单(ListCtrl类里编辑,给ListCtrl 发送NM_RCLICK消息)
在开发中会用到右键菜单,我们来一起学习一下. 假如,我们现在已经准备好了列表,就差右键处理了. 1.在资源视图中的添加一个MENU,如图 2.给要添加右键菜单的ListCtrl子类,添加消息 按 ct ...
- 【JavaScript】--JavaScript总结一览无余
对于 北风网李炎恢老师的JavaScript的视频也真的是醉了.视频整体来说结构清晰.内容比較简单.JS是一种灵活,开放的语言,语法规则并没有那么的死板.非常easy让人接受. JS的基础部分跟C#类 ...
- Maven学习总结(15)——Maven 项目中pom.xml详解
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2 ...
- CodeVs——T 4919 线段树练习4
http://codevs.cn/problem/4919/ 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Descr ...
- 使用Intent的Flag设置启动參数
Intent中关于激活Activity的Flag Intent类定义了一批常量,用于配置激活Activity时的相关參数; 在Intent中设置Flag ·调用Intent的setFlags()或ad ...
- 学习C#修饰符:类修饰符和成员修饰符
C#修饰符之类修饰符:public.internal. partial.abstract.sealed.static C#修饰符之成员修饰符:public.protected.private.inte ...
- 自定义npm包的创建、发布、更新和撤销
大纲 1.准备2.自定义npm包3.发布自定义npm包4.引用npm包5.更新npm包6.撤销发布的npm包 简书原文 https://www.jianshu.com/p/d737bc5df5b7 1 ...
- js读取json,纠结。。。
什么是json.先小抄一段: JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.採用全然独立于语言的文本格式, 是理想的数据交换格式,同一时候,JSO ...
- Declarative Widgets is a QML plugin that adds Qt Widgets support to QML
05.04.2018 Nathan Collins 8 comments FacebookTwitterGoogle+LinkedInEmail Declarative Widgets is a ...
- HDU 1215 七夕节 数学题~
http://acm.hdu.edu.cn/showproblem.php?pid=1215 题目大意: 找对象的题...汗..将你的编号(唯一)的所有因子加起来,所得到的的另一个编号的主人就是你的另 ...