【题解】洛谷P2822 [NOIP2016TG ]组合数问题 (二维前缀和+组合数)
洛谷P2822:https://www.luogu.org/problemnew/show/P2822
思路
由于n和m都多达2000
所以暴力肯定是会WA的
因为整个组合数是不会变的
所以我们想到存下这个组合数(杨辉三角)阵型
注意要用二维前缀和存下 后来的k次询问就可以用O(1)解答
关于二维前缀和
用此图可以解答:

关键代码:s[i][j]=s[i][j-1]+s[i-1][j]-s[i-1][j-1];
来自dalao的口诀:上加左 减左上 加自己
代码
#include<iostream>
using namespace std;
#define maxn 2005
int c[maxn][maxn],s[maxn][maxn];
int t,k,m,n;
void build()
{
for(int i=;i<=;i++)
{
c[i][]=c[i][i]=;
for(int j=;j<=i-;j++)
c[i][j]=(c[i-][j-]+c[i-][j])%k;//杨辉三角递推
}
for(int i=;i<=;i++)
{
for(int j=;j<=i;j++)
{
s[i][j]=s[i][j-]+s[i-][j]-s[i-][j-];
if(!c[i][j])//如果c[i][j]为0说明 它是k的倍数
s[i][j]+=;//ans加1
}
s[i][i+]=s[i][i];//详见后文注释<1>
}
}
int main()
{
cin>>t>>k;
build();
while(t)
{
t--;
cin>>n>>m;
if(m>n) m=n;//m不能大于n
cout<<s[n][m]<<endl;
}
}
注释<1>:
补齐杨辉三角的右上角一排 否则二维前缀和在最右边无法算出
对于k=2
例: 1 0 0 如果不加这句代码 0
1 1 0 0 0 0 0
1 2 1 0 1 1 1 0 1 0
1 3 3 1 0 1 1 1 1 0 1 0 0
对于最右边的一排1的位置的前缀和无法计算 因为没有上面的值
【题解】洛谷P2822 [NOIP2016TG ]组合数问题 (二维前缀和+组合数)的更多相关文章
- 洛谷.3437.[POI2006]TET-Tetris 3D(二维线段树)
题目链接 下落一个d*s的方块,则要在这个平面区域找一个最高的h' 更新整个平面区域的值为h+h' 对于本题,维护最大高度h和all 对于平面的x轴维护一棵线段树t1,每个t1的节点维护对应y轴的两棵 ...
- 洛谷P3437 [POI2006]TET-Tetris 3D(二维线段树 标记永久化)
题意 题目链接 Sol 二维线段树空间复杂度是多少啊qwqqq 为啥这题全网空间都是\(n^2\)还有人硬要说是\(nlog^2n\)呀.. 对于这题来说,因为有修改操作,我们需要在外层线段树上也打标 ...
- 洛谷 P5471 - [NOI2019] 弹跳(二维线段树优化建图+堆优化存边)
题面传送门 一道非常有意思的题(大概可以这么形容?) 首先看到这类一个点想一个区域内连边的题目可以很自然地想到线段树优化建图,只不过这道题是二维的,因此需要使用二维线段树优化建图,具体来说,我们外层开 ...
- [洛谷P2742]【模板】二维凸包([USACO5.1]圈奶牛Fencing the Cows)
题目大意:求一个点集凸包边长 题解:求凸包,直接求 卡点:发现在较后面数位上有较小的误差,还以为是浮点数误差,最后发现是构造函数写成了$int$类型 C++ Code: #include <al ...
- 洛谷P2742 【模板】二维凸包
题意 求凸包 Sol Andrew算法: 首先按照$x$为第一关键字,$y$为第二关键字从小到大排序,并删除重复的点 用栈维护凸包内的点 1.把$p_1, p_2$放入栈中 2.若$p_{i{(i & ...
- 洛谷 P1855 榨取kkksc03 (二维费用背包)
加多一维就行了 #include<cstdio> #include<algorithm> #include<cstring> #define REP(i, a, b ...
- LuoguP2822 组合数问题(组合数,二维前缀和)
P2822 组合数问题 输入输出样例 输入样例#1: 复制 1 2 3 3 输出样例#1: 复制 1 输入样例#2: 复制 2 5 4 5 6 7 输出样例#2: 复制 0 7 说明 [样例1说明] ...
- TTTTTTTTTTTTT CF Good Bye 2015 C- New Year and Domino(CF611C) 二维前缀
题目 题意:给你一个n*m由.和#组成的矩阵,.代表可以放,#代表不可以,问在左上角(px,py)到(右下角qx,qy)这样的一个矩阵中,放下一个长度为2宽度为1的牌有多少种放法: #include ...
- 洛谷 P2822 组合数问题 题解
今天又考试了...... 这是T2. Analysis 考试时想了一个判断质因数个数+打表的神奇方法,但没在每次输入n,m时把ans置0,50分滚粗. 看了题解才发现原来是杨辉三角+二维前缀和,果然还 ...
随机推荐
- xampp安装步骤及启动
1 chmod 755 xampp-linux-*-installer.run 2 sudo ./xampp-linux-*-installer.run 启动停止 3 sudo /opt/lampp ...
- java的访问修饰符
Java中通过访问控制符(default,private,public,protected)来控制对类.变量.方法.构造方法的访问. 下表说明了4中修饰符的访问权限: 修饰符 当前类 同一包内 子孙类 ...
- lua 遍历table
lua中有四种主要的遍历一个table的方法. 第一种方法: for key, value in pairs(testtb) do xxxx end 这种方法是按照key哈希后的顺序遍历的.比如下面代 ...
- JavaScript对象 创建对象(二)
组合使用构造函数和原型模式创建对象 function Person(name, age, job){ this.name = name; this.age = age; this.job = job; ...
- jquery 获取easyui combobox选中的值、赋值
jquery easyui combobox 控件支持单选和多选 1.获取选中的值 $('#comboboxlist').combobox('getValue'); //单选时 $('#combob ...
- 1.net平台
.net/dotnet:一般指的是.Net Framework框架,是一种平台,一种技术. .net Framewoek框架是.net平台不可缺少的一部分,它提供了一个稳定的运行环境来保证.net ...
- 2018-12-20 第二章Java 预习作业
一.什么是变量?如何使用变量? 答:变量是在程序运行中其值可以改变的量,它是Java程序的一个基本存储单元. 变量的语法格式如下: [访问修饰符]变量类型 变量名[=初始值]: 二.java中基本数据 ...
- oracle学习篇八:约束
----约束------- --1.主键约束--唯一标识,不能为空,通常用于ID--1>创建主键create table person(id varchar2(20) primary key,n ...
- centos-7.2 node.js免编译安装
cd /usr/local/ wget https://npm.taobao.org/mirrors/node/v8.9.3/node-v8.9.3-linux-x64.tar.gz tar -zxv ...
- 引爆你的Javascript代码进化 (转)
转自 海玉的博客 方才在程序里看到一段JS代码,写法极为高明,私心想着若是其按照规范来写,定可培养对这门语言的理解,对JS编程能力提高必是极好的.说人话:丫代码写的太乱,看的窝火! 最近闲暇无事,准备 ...