CJOJ 2255 【NOIP2016】组合数问题 / Luogu 2822 组合数问题 (递推)

Description

组合数$$C^m_n$$表示的是从n个物品中选出m个物品的方案数。举个例子,从(1,2,3) 三个物品中选择两个物品可以有(1,2),(1,3),(2,3)这三种选择方法。根据组合数的定 义,我们可以给出计算组合数的一般公式:

\[C^m_n=\frac{n!}{m!(n-m)!}
\]

其中n! = 1 × 2 × · · · × n

小葱想知道如果给定n,m和k,对于所有的0 <= i <= n,0 <= j <= min(i,m)有多少对 (i,j)满足是k的倍数。

Input

第一行有两个整数t,k,其中t代表该测试点总共有多少组测试数据。

接下来t行每行两个整数n,m。

Output

t行,每行一个整数代表答案。

Sample Input

1 2

3 3

Sample Output

1

Http

Luogu:https://www.luogu.org/problem/show?pid=2822

CJOJ:http://oj.changjun.com.cn/problem/detail/pid/2255

Source

递推

解决思路

不要被题目给出的那个式子给迷惑了!要是真按照那么算,肯定会爆掉!

这道题我们可以离线地来做。我们知道,计算组合数除了上面题目中给出的通项式之外,还有一个递推式:

\[C^m_n=C^{m-1}_{n}+C^{m-1}_{n-1}
\]

那么我们可以开一个二维数组存下所有的组合数(题目范围只有2000嘛)。至于是否整除的问题,我们可以在每一步计算的时候%k,这样既保证了不会爆掉long long 又能求出是否整除(若最后算出来是0就是可以整除啦)。

我们再把能整除的置为1,不能整除的置为0,求一下二维前缀和,然后就可以O(1)地回答询问啦。

代码

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std; const int maxN=2000;
const int inf=2147483647; int n,m,mod;
int C[maxN+10][maxN+10];
int If[maxN+10][maxN+10]; int main()
{
int TT;
cin>>TT>>mod;
memset(C,0,sizeof(C));
for (int i=0;i<=maxN;i++)//递推算出所有的组合数并取膜
{
C[i][0]=1;
for (int j=1;j<=i;j++)
C[i][j]=(C[i-1][j]+C[i-1][j-1])%mod;
}
for (int i=0;i<=maxN;i++)
for (int j=0;j<=i;j++)//构造二维前缀和初值
If[i][j]=(bool)(C[i][j])^1;
/*for (int i=0;i<=10;i++)
{
for (int j=0;j<=10;j++)
cout<<If[i][j]<<' ';
cout<<endl;
}
cout<<endl;*/
for (int i=1;i<=maxN;i++)//计算二维前缀和
for (int j=1;j<=maxN;j++)
If[i][j]=If[i][j]+If[i-1][j]+If[i][j-1]-If[i-1][j-1];
/*for (int i=0;i<=10;i++)
{
for (int j=0;j<=10;j++)
cout<<If[i][j]<<' ';
cout<<endl;
}
cout<<endl;*/
for (int ti=1;ti<=TT;ti++)//回答询问
{
cin>>n>>m;
cout<<If[n][m]<<endl;
}
return 0;
}

CJOJ 2255 【NOIP2016】组合数问题 / Luogu 2822 组合数问题 (递推)的更多相关文章

  1. Luogu T7152 细胞(递推,矩阵乘法,快速幂)

    Luogu T7152 细胞(递推,矩阵乘法,快速幂) Description 小 X 在上完生物课后对细胞的分裂产生了浓厚的兴趣.于是他决定做实验并 观察细胞分裂的规律. 他选取了一种特别的细胞,每 ...

  2. luogu 1291 概率期望递推

    非常好的递推 公式啥的懒得写了,直接放链接哈哈哈https://www.luogu.org/problemnew/solution/P1291 #include<bits/stdc++.h> ...

  3. Codeforces Gym10081 A.Arcade Game-康托展开、全排列、组合数变成递推的思想

    最近做到好多概率,组合数,全排列的题目,本咸鱼不会啊,我概率论都挂科了... 这个题学到了一个康托展开,有点用,瞎写一下... 康托展开: 适用对象:没有重复元素的全排列. 把一个整数X展开成如下形式 ...

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

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

  5. Noip2016 提高组 Day2 T1 组合数问题

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

  6. 【NOIP2016】组合数问题 题解(组合数学+递推)

    题目链接 题目大意:给定$n,m,k$,求满足$k|C_i^j$的$C_i^j$的个数.$(0\leq i\leq n,1\leq j\leq \min(i,m))$. --------------- ...

  7. SDUT1574组合数的计算(组合数)

    http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=1574 这个题,比较奇怪,是用递推去做的,我试了 ...

  8. CJOJ 1331 【HNOI2011】数学作业 / Luogu 3216 【HNOI2011】数学作业 / HYSBZ 2326 数学作业(递推,矩阵)

    CJOJ 1331 [HNOI2011]数学作业 / Luogu 3216 [HNOI2011]数学作业 / HYSBZ 2326 数学作业(递推,矩阵) Description 小 C 数学成绩优异 ...

  9. 一种递推组合数前缀和的Trick

    记录一下一种推组合数前缀和的方法 Trick 设\(\sum_{i = 0}^m C_n^i = S(n, m)\) \(S\)是可以递推的 \(S(n, m + 1) = S(n, m) + C_{ ...

随机推荐

  1. mysql之 binlog维护详细解析(开启、binlog相关参数作用、mysqlbinlog解读、binlog删除)

    binary log 作用:主要实现三个重要的功能:用于复制,用于恢复,用于审计.binary log 相关参数:log_bin设置此参数表示启用binlog功能,并指定路径名称log_bin_ind ...

  2. javaSE_08Java中static、继承、重写-思维导图

    思维导图看不清楚时: 1)可以将图片另存为图片,保存在本地来查看 : 2)右击在新标签中打开放大查看 (IE不支持,搜狗,360可以):

  3. Scrapy中使用Django的Model访问数据库

    Scrapy中使用Django的Model进行数据库访问 当已存在Django项目的时候,直接引入Django的Model来使用比较简单 # 使用以下语句添加Django项目的目录到path impo ...

  4. html5-表格的建立

    用表格显示信息调理清楚,使浏览者一目了然.表格在网页中还有协助布局的作用,可以把文字.图像等组织到表格的不同行列.那么,接下来我将讲解一下表格的常用属性. 首先,表格命令 表格的行:tr  每行中的列 ...

  5. 记一次调试串口设备Bug的经历

    最近花了差不多1天的时间在折腾一个Bug,该Bug的表象如下: 这个Bug还特别独特,在开发电脑中无提示,在终端用户那里每次使用软件的时候都报这个.仔细思考了一下最近在源码中新添加的功能,没发现有啥特 ...

  6. 常用linux小工具介绍

    1.ctags(Generate tag files for source code)是vim下方便代码阅读的工具.尽管ctags也可以支持其它编辑器,但是它正式支持的只有VIM. ctags 最先是 ...

  7. 12.ThreadPoolExecutor线程池原理及其execute方法

    jdk1.7.0_79  对于线程池大部分人可能会用,也知道为什么用.无非就是任务需要异步执行,再者就是线程需要统一管理起来.对于从线程池中获取线程,大部分人可能只知道,我现在需要一个线程来执行一个任 ...

  8. 如何让.Net线程支持超时后并自动销毁!

    如何让.Net线程支持超时后并自动销毁! 1.使用CancellationTokenSource之基于Task实现方式 CancellationTokenSource source = new Can ...

  9. 玩转spring boot——websocket

    前言 QQ这类即时通讯工具多数是以桌面应用的方式存在.在没有websocket出现之前,如果开发一个网页版的即时通讯应用,则需要定时刷新页面或定时调用ajax请求,这无疑会加大服务器的负载和增加了客户 ...

  10. (6)javascript的程序控制结构及语句-----(1)条件判断

    程序控制结构及语句 编程就是将现实应用,转换为程序能够读得懂的语法语句.Javascript编程中对程序流程控制主要是通过条件判断语句.循环控制语句及continue.break来完成的,其中条件判断 ...