前言:

“所有的组合数问题都是好题”

————清华某高材生zhx

组合数问题在近几年的NOIP的考试中多次露面,感觉有必要好好学一学

组合数的常见公式:

       C  (  i  , j  )  =           

                     C(i,j)  =   C( i-1  , j) +  C ( i -1  , j -1  ) ;

 题目:

计算系数

 noip2011提高组day2第1题

输入输出样例

输入样例:

1 1 3 1 2
输出样例:

3

这个题用到了二项式定理,在高二数学选修课本中讲到。不过,对于这个题你不需要知道这个知识,你只需要知道以下几点:

规定(a+b)^k     k为指数

1 、  二项式的系数就与杨辉三角有关,即与组合数有关

2、 k为几,就代表是杨辉三角的第几行

3、我们将上述二项式展开后可发现: 越往后的每一项,a的指数是在递减的,而b的指数是在增加的 ,  例如:第一项a的指数是k,b的指数是0   ,最后一项a的指数是0,b的指数是k

4、 拓展:根据展开式可发现,二项式的系数是对称的

思路讲解:

我们已知上述信息之后便可轻松解决本题啦

1、二项式的指数是k,根据上面的信息2可知,答案在杨辉三角的第k行

2、根据上述信息4可知,我们求的是杨辉三角的第k行的第m项或者是第n项(对称性)

3、此题与原始组合数不同的是:我们需要在系数上乘上 a  的 最终的值,再乘上  b  最终的值

我们可以思考:如果我们将  a  与    x  等同的看作是一个未知数的话  ,那么如果   x最终变成x^n    , a也应该等同的成为   a ^ n

所以答案就是      a的n次方  乘以   b的m次方    乘以  杨辉三角的第k行,第n项

即    系数最终的答案就是  a^n  *   b^m   *    C 【k】【m】

4、对于求解  a^n 和 b^m 我们可以用快速幂   ,但是要注意我们在读入a,b之后一定要先取一次模 ,否则我们在快速幂第一次计算  a*a  的时候 会炸掉

#include<iostream>
#include<cstdio>
#include<cstring> using namespace std; int c[1009][1009]; int quick_power(int a,int b ,int p){
int ans=1;
while(b>0){
if(b%2==1)ans=(ans*a)%p;
a=(a*a)%p;
b=b/2;
}
return ans;
} int main(){
int a,b,k,n,m;
cin>>a>>b>>k>>n>>m;
a=a%10007;
b=b%10007;
c[1][1]=1;
for(int i=0;i<=k;i++){
c[i][0]=1;
for(int j=1;j<=i;j++){
c[i][j]=(c[i-1][j]+c[i-1][j-1])%10007;
}
} a=quick_power(a,n,10007);
b=quick_power(b,m,10007); cout<<((a*b)%10007*c[k][n])%10007<<endl; return 0;
}

组合数问题

NOIP提高组2016

输入输出样例

输入样例#1:

1 2
3 3
输出样例#1:

1

输入样例#2:

2 5
4 5
6 7
输出样例#2:

0
7

思路讲解

既然上面那题都做完了,这个题也就不难了

这个题是让你找在不超过它给你的   i 和  j  的范围之内求组合数 答案是 k  的倍数的数

我们可以先预处理出2000*2000  以内的所有的组合数

但是如果即使这样预处理了,我们对于每一组测试数据都暴力的去计算一遍有多少对的话,我们可以发现  2000*2000* 10000  是明显过不掉这道题的

我们观察一下,我们的k值是一直不变的  ,所以我们可以对于当前的每一个C( i , j)  我们都可以用前缀和求出他之前有多少个   ,如果当前这个数是k的倍数的话(即:C( i, j )%k==0)  我们就把刚求出来的前缀和+1就是当前的答案

 1 #include<iostream>
2 #include<cstdio>
3 #include<cstring>
4
5 using namespace std;
6
7 int c[2020][2020];
8 int a[2020][2020];
9 int t,k;
10 void C(){
11 for(int i=0;i<=2018;i++){
12 c[i][0]=1;
13 for(int j=1;j<=i;j++){
14 c[i][j]=(c[i-1][j]+c[i-1][j-1])%k;
15 }
16 }
17 }
18
19
20
21
22 int main(){
23 c[1][1]=1;
24 scanf("%d%d",&t,&k);
25 C();
26 for(int i=2;i<=2018;i++){
27 for(int j=1;j<=i;j++){
28 a[i][j]=a[i-1][j]+a[i][j-1]-a[i-1][j-1];
29 if(c[i][j]==0)a[i][j]=a[i][j]+1;
30 }
31 a[i][i+1]=a[i][i];
32 }
33 for(int i=1;i<=t;i++){
34 int n,m;
35 scanf("%d%d",&n,&m);
36 if(m>n)m=n;
37 printf("%d\n",a[n][m]);
38 }
39 return 0;
40 }

最后加一道最简单的组合数问题练练手吧

扑克牌

附上链接:https://www.luogu.org/problemnew/show/P1358#sub

End.

NOIP组合数选题的更多相关文章

  1. 历年NOIP选题题解汇总

    联赛前上vijos板刷往年联赛题,使用在线编辑编写代码,祝我rp++. 废话不多说,挑比较有意思的记一下. 题目是按照年份排序的,最早只到了03年. 有些题目因为 我还没写/很早之前写的忘了 所以就没 ...

  2. noip 2016 day2 t1组合数问题

    题目描述 组合数表示的是从n个物品中选出m个物品的方案数.举个例子,从(1,2,3) 三个物品中选择两个物品可以有(1,2),(1,3),(2,3)这三种选择方法.根据组合数的定 义,我们可以给出计算 ...

  3. NOIP 2016 提高组 复赛 Day2T1==洛谷2822 组合数问题

    题目描述 组合数表示的是从n个物品中选出m个物品的方案数.举个例子,从(1,2,3) 三个物品中选择两个物品可以有(1,2),(1,3),(2,3)这三种选择方法.根据组合数的定 义,我们可以给出计算 ...

  4. NOIP 2016 组合数问题

    洛谷 P2822 组合数问题 洛谷传送门 JDOJ 3139: [NOIP2016]组合数问题 D2 T1 JDOJ传送门 Description 组合数Cnm表示的是从n个物品中选出m个物品的方案数 ...

  5. 牛客NOIP暑期七天营-提高组6C:分班问题 (组合数)

    题意:A班有N个人,B班有M个人,现在要组成一个新的班级C班,为了公平,从AB班各抽相同人数的人. 现在求所有方案中,人数之和是多少. 思路:即求Σ k*C(N,k)*C(M,k);    先忽略这个 ...

  6. 纪中集训2020.02.05【NOIP提高组】模拟B 组总结反思——【佛山市选2010】组合数计算,生成字符串 PPMM

    目录 JZOJ2290. [佛山市选2010]组合数计算 比赛时 之后 JZOJ2291. [佛山市选2010]生成字符串 比赛时 之后 JZOJ2292. PPMM 比赛时 之后 JZOJ2290. ...

  7. 【noip 2016】 组合数问题(problem)

    杨辉三角形求组合数问题 原题点这里 #include <iostream> #include <cmath> using namespace std; long long a[ ...

  8. 2018.10.23 NOIP训练 Leo的组合数问题(组合数学+莫队)

    传送门 好题. 考察了莫队和组合数学两个知识板块. 首先需要推出单次已知n,mn,mn,m的答案的式子. 我们令f[i]f[i]f[i]表示当前最大值为第iii个数的方案数. 显然iii之后的数都是单 ...

  9. Noip模拟题 Matrix [递推,组合数]

    Matrix 时间限制: 1 Sec  内存限制: 512 MB 题目描述 小 z 的女朋友送给小 z 一个 n × n 的矩阵.但是矩阵实在太大了,小 z 的女朋友拿不动,只能带给他两个长度为 n ...

随机推荐

  1. 2021升级版微服务教程5—通过IDEA运行多个项目实例「模拟集群」

    2021升级版SpringCloud教程从入门到实战精通「H版&alibaba&链路追踪&日志&事务&锁」 教程全目录「含视频」:https://gitee.c ...

  2. MyBatis初级实战之一:Spring Boot集成

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  3. ASP.NET Core中的数据保护

    在这篇文章中,我将介绍ASP.NET Core 数据保护系统:它是什么,为什么我们需要它,以及它如何工作. 为什么我们需要数据保护系统? 数据保护系统是ASP.NET Core使用的一组加密api.加 ...

  4. Flutter 布局类组件:流式布局(Wrap和Flow)

    前言 把超出屏幕显示范围会自动折行的布局称为流式布局.Flutter中通过Wrap和Flow来支持流式布局,将Row换成Wrap后溢出部分则会自动折行. Wrap 接口描述 Wrap({ Key ke ...

  5. Session、Cookie与Token

    http协议是无状态协议 协议是指计算机通信网络中两台计算机之间进行通信所必须共同遵守的规定或规则,超文本传输协议(HTTP)是一种通信协议,它允许将超文本标记语言(HTML)文档从Web服务器传送到 ...

  6. JavaScript学习总结(基础知识)

    js代码引入 方式1: <script> alert('欢迎来到德玛西亚!') </script> 方式2:外部文件引入 src属性值为js文件路径 <script sr ...

  7. Py变量,递归,作用域,匿名函数

    局部变量与全局变量 全局变量:全局生效的变量,在顶头的,无缩进的定义的变量. 局部变量:函数内生效的变量,在函数内定义的变量. name='1fh' def changename(): name='s ...

  8. Scrapy———反爬蟲的一些基本應對方法

    1. IP地址驗證 背景:有些網站會使用IP地址驗證進行反爬蟲處理,檢查客戶端的IP地址,若同一個IP地址頻繁訪問,則會判斷該客戶端是爬蟲程序. 解決方案: 1. 讓Scrapy不斷隨機更換代理服務器 ...

  9. 【Soul网关探秘】http数据同步-Admin通知前处理

    引言 本篇开始研究 Soul 网关 http 数据同步,将分为三篇进行分析: <Admin通知前处理> <变更通知机制> <Bootstrap处理变更通知> 希望三 ...

  10. MySQL调优性能监控之show profile

    用show profile查询工具指定具体的type show profile在mysql5.7之后过时 show profile命令用于跟踪执行过的sql语句的资源消耗信息,可以帮助查看sql语句的 ...