CJOJ 2255 【NOIP2016】组合数问题 / Luogu 2822 组合数问题 (递推)
CJOJ 2255 【NOIP2016】组合数问题 / Luogu 2822 组合数问题 (递推)
Description
组合数$$C^m_n$$表示的是从n个物品中选出m个物品的方案数。举个例子,从(1,2,3) 三个物品中选择两个物品可以有(1,2),(1,3),(2,3)这三种选择方法。根据组合数的定 义,我们可以给出计算组合数的一般公式:
\]
其中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
递推
解决思路
不要被题目给出的那个式子给迷惑了!要是真按照那么算,肯定会爆掉!
这道题我们可以离线地来做。我们知道,计算组合数除了上面题目中给出的通项式之外,还有一个递推式:
\]
那么我们可以开一个二维数组存下所有的组合数(题目范围只有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 组合数问题 (递推)的更多相关文章
- Luogu T7152 细胞(递推,矩阵乘法,快速幂)
Luogu T7152 细胞(递推,矩阵乘法,快速幂) Description 小 X 在上完生物课后对细胞的分裂产生了浓厚的兴趣.于是他决定做实验并 观察细胞分裂的规律. 他选取了一种特别的细胞,每 ...
- luogu 1291 概率期望递推
非常好的递推 公式啥的懒得写了,直接放链接哈哈哈https://www.luogu.org/problemnew/solution/P1291 #include<bits/stdc++.h> ...
- Codeforces Gym10081 A.Arcade Game-康托展开、全排列、组合数变成递推的思想
最近做到好多概率,组合数,全排列的题目,本咸鱼不会啊,我概率论都挂科了... 这个题学到了一个康托展开,有点用,瞎写一下... 康托展开: 适用对象:没有重复元素的全排列. 把一个整数X展开成如下形式 ...
- NOIP 2016 提高组 复赛 Day2T1==洛谷2822 组合数问题
题目描述 组合数表示的是从n个物品中选出m个物品的方案数.举个例子,从(1,2,3) 三个物品中选择两个物品可以有(1,2),(1,3),(2,3)这三种选择方法.根据组合数的定 义,我们可以给出计算 ...
- Noip2016 提高组 Day2 T1 组合数问题
题目描述 组合数表示的是从n个物品中选出m个物品的方案数.举个例子,从(1,2,3) 三个物品中选择两个物品可以有(1,2),(1,3),(2,3)这三种选择方法.根据组合数的定 义,我们可以给出计算 ...
- 【NOIP2016】组合数问题 题解(组合数学+递推)
题目链接 题目大意:给定$n,m,k$,求满足$k|C_i^j$的$C_i^j$的个数.$(0\leq i\leq n,1\leq j\leq \min(i,m))$. --------------- ...
- SDUT1574组合数的计算(组合数)
http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=1574 这个题,比较奇怪,是用递推去做的,我试了 ...
- CJOJ 1331 【HNOI2011】数学作业 / Luogu 3216 【HNOI2011】数学作业 / HYSBZ 2326 数学作业(递推,矩阵)
CJOJ 1331 [HNOI2011]数学作业 / Luogu 3216 [HNOI2011]数学作业 / HYSBZ 2326 数学作业(递推,矩阵) Description 小 C 数学成绩优异 ...
- 一种递推组合数前缀和的Trick
记录一下一种推组合数前缀和的方法 Trick 设\(\sum_{i = 0}^m C_n^i = S(n, m)\) \(S\)是可以递推的 \(S(n, m + 1) = S(n, m) + C_{ ...
随机推荐
- 安装lnmp集成环境
具体配置看原文,不重新复述: 原文:https://lnmp.org/install.html 因为配置数据库主从,需要保持两台mysql数据库服务器的mysql版本号一致,所以又重新装了一次..重新 ...
- 华为A199:近期不会再买华为的手机了
为了支持国货,也省点钱,买了个华为A199: 缺点: 没有google play market很复杂的刷机后才能装Gmail 不过也有亮点: 自带录音功能,老htc通过软件也只能录单方向的哦关机闹 ...
- ACL2016信息抽取与知识图谱相关论文掠影
实体关系推理与知识图谱补全 Unsupervised Person Slot Filling based on Graph Mining 作者:Dian Yu, Heng Ji 机构:Computer ...
- 每天一个JS 小demo之个人信息添加。主要知识点:DOM操作中的表格操作,节点操作
以下是简易效果: <!DOCTYPE html><html lang="en"><head> <meta charset="UT ...
- 原生和jQuery的ajax用法
jQuery的ajax方法: $.ajax({ url:'/comm/test1.php', type:'POST', //GET async:true, //或false,是否异步 data:{ n ...
- 【原】vue单文件组件互相通讯
在vue中,我们可以把一个页面各个部分单独封装起来,做成各种小组件,然后加载,这样的好处是代码维护起来比较容易,重复的代码多处调用! 在一个vue项目中,单文件组件以.vue形式文件命名 每个组件之间 ...
- ecshop支付方式含线下自提
用户展示页面模板所在:如ecshop/theme/default/flow.dwt 后台管理展示页面模板所在:如admin/templates/payment_list.htm ecshop 支付接口 ...
- POJ 2388
还是水题,简单的排序.大半夜的,没脑子想太复杂的代码了,就随手找了段以前写的插入排序将就着用了. 题目的意思就是取一个数列的中位数,很简单,排序后取a[n/2]即可. 代码如下: #ifndef _2 ...
- 基于Spring的最简单的定时任务实现与配置(一)
朋友的项目中有点问题.他那边是Spring架构的,有一个比较简单的需要定时的任务执行.在了解了他的需求之后,于是提出了比较简单的Spring+quartz的实现方式. 注意本文只是讨论,在已搭建完毕的 ...
- 使用ConfuserEx加密混淆程序以及如何脱壳反编译
一,准备如下工具: ConfuserEx.UnConfuserEx.Fixer.ConfuserExStringDecryptor.ConfuserExSwitchKiller.de4dot.ILSp ...