洛谷P1358 扑克牌
来源:互联网 发布:盐城市大数据产业园 编辑:程序博客网 时间:2024/05/20 02:51
题目描述
组合数学是数学的重要组成部分,是一门研究离散对象的科学,它主要研究满足一定条件的组态(也称组合模型)的存在、计数以及构造等方面的问题。组合数学的主要内容有组合计数、组合设计、组合矩阵、组合优化等。
随着计算机科学的日益发展,组合数学的重要性也日渐凸显,因为计算机科学的核心内容是使用算法处理离散数据。
今天我们来研究组合数学中的一个有趣的问题,也是一个简单的计数问题:
从一副含有n(n≤10000)张的扑克牌[显然每张扑克牌都不相同]中,分给m(m≤100)个人,第i个人得到ai (0≤ai≤100)张牌,求一共有几种分法,这个数可能非常大,请输出此数模10007后的结果。
输入输出格式
输入格式:第一行两个整数 为 n m
第二行 m个整数 ai
输出格式:此数模10007后的结果
输入输出样例
输入样例#1:
5 23 1【样例输入2】20 191 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
输出样例#1:
【样例输出1】20【样例输出2】8707
说明
【数据规模】对于50%的数据,M = 1。
数论题。。。
虽然被打上了 DP 的标签。。。
杨辉三角也算是背包。。。
附代码:
#include<iostream>#include<algorithm>#include<cstdio>#define MAXN 110#define MAXM 10010#define MOD 10007using namespace std;int n,m,k,s=1,a[MAXN],f[MAXM][MAXN];inline int read(){int date=0,w=1;char c=0;while(c<'0'||c>'9'){if(c=='-')w=-1;c=getchar();}while(c>='0'&&c<='9'){date=date*10+c-'0';c=getchar();}return date*w;}void make(){for(int i=1;i<=MAXM;i++)f[i][1]=1;for(int i=2;i<=MAXM;i++)for(int j=2;j<=MAXN;j++)f[i][j]=(f[i-1][j-1]+f[i-1][j])%MOD;}int main(){m=read();n=read();k=m;make();for(int i=1;i<=n;i++){a[i]=read();s=(s*f[k+1][a[i]+1])%MOD;k-=a[i];if(k<0){printf("0\n");return 0;}}printf("%d\n",s);return 0;}
阅读全文
0 0
- 洛谷P1358 扑克牌
- 扑克牌
- 扑克牌
- 扑克牌
- 扑克牌
- 扑克牌
- 扑克牌
- 扑克牌
- 扑克牌
- 扑克牌
- 扑克牌
- 【九度OJ合集】P1201-P1358
- 扑克牌与一副扑克牌
- 扑克牌发牌
- 扑克牌图片
- 猜扑克牌
- 扑克牌游戏软件
- 猜测扑克牌
- oracle取出多个字段列中的最大值和最小值
- TIOBE 11 月编程语言排行榜,脚本语言怎么了?
- Mybatis动态SQL
- 算法-如何计算时间复杂度?
- 10个深度学习软件的安装指南(附代码)
- 洛谷P1358 扑克牌
- 近期活动盘点:基于雷达图像预测未来降水参赛经验分享、大数据基础设施讲座、药品行业分析及大数据应用思享会(11.22-11.29)
- 软工文档感受----编程人员必读文档
- win10安装win7虚拟机记录
- 创业企业如何才能具有国际范儿?瀚思科技告诉你
- Sublime Text全程指南
- windows下用docker安装tensorflow
- Python与C之间的相互调用(Python C API及Python ctypes库)
- PAT1030