博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
洛谷——P1358 扑克牌
阅读量:7062 次
发布时间:2019-06-28

本文共 1248 字,大约阅读时间需要 4 分钟。

题目描述

组合数学是数学的重要组成部分,是一门研究离散对象的科学,它主要研究满足一定条件的组态(也称组合模型)的存在、计数以及构造等方面的问题。组合数学的主要内容有组合计数、组合设计、组合矩阵、组合优化等。

随着计算机科学的日益发展,组合数学的重要性也日渐凸显,因为计算机科学的核心内容是使用算法处理离散数据。

今天我们来研究组合数学中的一个有趣的问题,也是一个简单的计数问题:

从一副含有n(n≤10000)张的扑克牌[显然每张扑克牌都不相同]中,分给m(m≤100)个人,第i个人得到ai (0≤ai≤100)张牌,求一共有几种分法,这个数可能非常大,请输出此数模10007后的结果。

输入输出格式

输入格式:

 

第一行两个整数 为 n m

第二行 m个整数 ai

 

输出格式:

 

此数模10007后的结果

 

输入输出样例

输入样例#1: 
【样例输入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。

 

我们单看每一个人,一个人从n张牌中拿m张牌,那么它有c[m][n]中情况,然后我们拿完这些牌后剩下n-m张牌,、、、以此类推、、

#include
#include
#include
#include
#define N 10010#define mod 10007using namespace std;int c[N][110],n,m,x,ans;int read(){ int x=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9'){
if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar(); return x*f;}int main(){ n=read(),m=read(); c[0][0]=1;ans=1; for(int i=1;i<=n;i++) for(int j=0;j<=min(100,i);j++) c[i][j]=(c[i-1][j-1]+c[i-1][j])%mod; while(m--) { x=read(); ans=1ll*ans*c[n][x]%mod; n-=x; } printf("%d",ans); return 0;}

 

转载于:https://www.cnblogs.com/z360/p/7892197.html

你可能感兴趣的文章
[LeetCode] Valid Palindrome
查看>>
聊下 git remote prune origin
查看>>
【转】如何用 Chrome for Android 做远程遥控 debugging
查看>>
Ajax异步验证登陆或者注册
查看>>
整合百度推送碰到的问题
查看>>
使用Fusioncharts实现后台处理进度的前台展示
查看>>
CentOS 7下配置本地yum源及yum客户端
查看>>
Mybatis中的collection、association来处理结果映射
查看>>
如何对 GIT 分支进行规划? (转)
查看>>
浅谈简单工作流设计——责任链模式配合策略与命令模式的实现
查看>>
HDOJ(HDU) 1406 完数
查看>>
gradle项目中资源文件的相对路径打包处理技巧
查看>>
让手机支持OTG,不看绝对后悔! - 我也做一回搬运工,解决RFID读卡器OTG支持问题...
查看>>
linux exec函数家族
查看>>
几种软负载均衡策略分析
查看>>
.net——序列化与反序列化中对日期时间的处理
查看>>
独家揭露网站内链建设seo优化的科学方法
查看>>
MVVM 模式介绍
查看>>
.NET Core采用的全新配置系统[10]: 配置的同步机制是如何实现的?
查看>>
阿里云AI首席科学家闵万里:让萧山救护车等待时间至少降低50%,“城市大脑”是如何做到的...
查看>>