https://www.luogu.org/problemnew/show/P2822(题目传送)

先了解一下有关组合数的公式:(m在上,n在下)

组合数通项公式:C(n,m)=n!/[m!(n-m)!]=(n-m+1)!/m!

组合数递推公式:C(n,m)=C(n-1,m-1)+C(n-1,m)

发现组合数的递推的直观图像形式就是杨辉三角(第i行第j列的数等于C(i-1,j-1))

由于题目要求多组组合数,便可以递推组合数做预处理(直接用通项公式算什么的太粗暴(慢)了)。一看数据范围,保证让普通范围溢出的节奏啊,但定心一看,我们只用知道每个组合数是否能整除k就可,所以可以每次递推算组合数时模k。  TIP:递推不要忘了初始状态(边界)

求出组合数后,发现如果对每次询问都从头到尾扫一遍的话保准会超时,便想到了一个能有效减少查询统计时的复杂度,每一次查询O(n)降到O(1)的神器——前缀和。求一个矩阵的前缀和,只要记住公式:上加左,减上左,加自己。

AC代码如下:

 #include<iostream>
#include<cstdio>
using namespace std;
int c[][],n[],m[],dp[][];
int main()
{
int t,k,mmax=,nmax=;
cin>>t>>k;
for(int i=;i<=t;i++)
{
scanf("%d%d",&n[i],&m[i]);
if(nmax<n[i]) nmax=n[i];
if(mmax<m[i]) mmax=m[i];
}
c[][]=;
int mmaxb=mmax;
if(mmax>nmax) mmax=nmax+;
else mmax++;
for(int i=;i<=nmax+;i++)
for(int j=;j<=min(i,mmax);j++)
{
c[i][j]=(c[i-][j-]+c[i-][j])%k;
if(!c[i][j]) dp[i-][j-]=;
}//这里用杨辉三角递推的组合数,***需要多做一行***,其实没有直接推组合数方便。
for(int j=;j<=mmaxb;j++) dp[][j]+=dp[][j-];
for(int i=;i<=nmax;i++)
for(int j=;j<=mmaxb;j++)
{
if(!j) dp[i][j]+=dp[i-][j];
else
dp[i][j]+=dp[i-][j]+dp[i][j-]-dp[i-][j-];
}
for(int i=;i<=t;i++) cout<<dp[n[i]][m[i]]<<endl;
return ;
}

洛谷P2822 组合数问题(题解)的更多相关文章

  1. 洛谷 P2822 组合数问题 题解

    今天又考试了...... 这是T2. Analysis 考试时想了一个判断质因数个数+打表的神奇方法,但没在每次输入n,m时把ans置0,50分滚粗. 看了题解才发现原来是杨辉三角+二维前缀和,果然还 ...

  2. 洛谷P2822组合数问题

    传送门啦 15分暴力,但看题解说暴力分有30分. 就是找到公式,然后套公式.. #include <iostream> #include <cstdio> #include & ...

  3. 洛谷 P2822 组合数问题

    题目描述 组合数C_n^mC​n​m​​表示的是从n个物品中选出m个物品的方案数.举个例子,从(1,2,3) 三个物品中选择两个物品可以有(1,2),(1,3),(2,3)这三种选择方法.根据组合数的 ...

  4. 洛谷P2822 组合数问题

    输入输出样例 输入样例#1: 1 2 3 3 输出样例#1: 1 输入样例#2: 2 5 4 5 6 7 输出样例#2: 0 7 说明 [样例1说明] 在所有可能的情况中,只有C_2^1 = 2C21 ...

  5. 洛谷——P2822 组合数问题

    https://www.luogu.org/problem/show?pid=2822 题目描述 组合数C_n^mC​n​m​​表示的是从n个物品中选出m个物品的方案数.举个例子,从(1,2,3) 三 ...

  6. 【洛谷P2822 组合数问题】

    题目连接 #include<iostream> #include<cstring> #include<cstdio> #include<cctype> ...

  7. 洛谷P2822 组合数问题 杨辉三角

    没想到这道题竟然这么水- 我们发现m,n都非常小,完全可以O(nm)O(nm)O(nm)预处理出stripe数组,即代表(i,j)(i,j)(i,j) 及其向上的一列的个数,然后进行递推即可. #in ...

  8. 【题解】洛谷P2822 [NOIP2016TG ]组合数问题 (二维前缀和+组合数)

    洛谷P2822:https://www.luogu.org/problemnew/show/P2822 思路 由于n和m都多达2000 所以暴力肯定是会WA的 因为整个组合数是不会变的 所以我们想到存 ...

  9. 洛谷P2832 行路难 分析+题解代码【玄学最短路】

    洛谷P2832 行路难 分析+题解代码[玄学最短路] 题目背景: 小X来到了山区,领略山林之乐.在他乐以忘忧之时,他突然发现,开学迫在眉睫 题目描述: 山区有n座山.山之间有m条羊肠小道,每条连接两座 ...

随机推荐

  1. JavaScript中的闭包和作用域链

    这部分几乎是JavaScript中最难的部分,也是面试官最爱问的地方. 下面的内容是我以前写的<JavaScript学习手册>中被客户删除的部分,理由听起来有点诡异:太难.

  2. mssql sqlserver 表增加列后,视图不会自动更新相关列的两种解决方法分享

    摘要: 今天对物理数据表,进行增加列操作后,程序一直显示无法找到相应列,通过仔细比对发现,视图中无相应列更新,下文将具体的解决方法分享如下: 例: create view vw_test as sel ...

  3. 【原】Java学习笔记022 - 字符串

    package cn.temptation; public class Sample01 { public static void main(String[] args) { // 字符串 // 定义 ...

  4. java-----理解java的三大特性之多态

    的java提高篇(四)-----理解的java的三大特性之多态 面向对象编程有三大特性:封装,继承,多态. 封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据.对外 ...

  5. CentOS7 Docker私有仓库搭建及删除镜像 【转】

    文章来源:centos7 Docker私有仓库搭建及删除镜像 如果不想用私有镜像库,你可以用docker的库 https://hub.docker.com 环境准备 环境:两个装有Docker 17. ...

  6. duilib

    https://www.cnblogs.com/lin1270/p/4109305.html

  7. jpa 分页

    public Page<Stability> testPager(){ Pageable pageable = new PageRequest(1, 10, Sort.Direction. ...

  8. HTML DOM 事件对象 ondragend 事件

    学习网站:http://www.runoob.com/jsref/event-ondragend.html 定义和用法 ondragend 事件在用户完成元素或首选文本的拖动时触发. 拖放是 HTML ...

  9. SQL CREATE DATABASE 语句

    CREATE DATABASE 语句 CREATE DATABASE 用于创建数据库. SQL CREATE DATABASE 语法 CREATE DATABASE database_name SQL ...

  10. Clion 配置

    plugins: one dark theme font : fira code retina