P2822 组合数问题 HMR大佬讲解
今天HMR大佬给我们讲解了这一道难题。
基本思路是:
可以将问题转化为:求出杨辉三角,用二维数组f[i][j]来表示在杨辉三角中以第i行第j列的点为右下角,第0行第0列处的点为左上角的矩阵中所有元素是k的倍数的个数;
那么这样一来f[i][j]的状态转移方程为:f[i][j]=f[i][j-1]+f[i-1][j]-f[i-1][j-1]
这个方程的意思是以第i行第j-1列的点为右下角的矩阵中的元素是k的倍数的个数+以第i-1行第j列的点为右下角的矩阵中的元素是k的倍数的个数-以第i-1行第j-1列的点为右下角的矩阵中的元素是k的倍数的个数,如果不减去f[i-1][j-1]的话就会多加上那一块重复的。
这是大佬的AC代码:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cctype>
#define ll long long
#define gc() getchar()
#define maxn 2005
using namespace std; inline ll read(){ //快读
ll a=;int f=;char p=gc();
while(!isdigit(p)){f|=p=='-';p=gc();}
while(isdigit(p)){a=(a<<)+(a<<)+(p^);p=gc();}
return f?-a:a;
}
void write(ll a){
if(a>)write(a/);
putchar(a%+'');
} int t,k,c[maxn][maxn],f[maxn][maxn];
int main(){
t=read();k=read();
for(int i=;i<=;++i)c[i][]=;
for(int i=;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){
f[i][j]=f[i-][j]+f[i][j-]-f[i-][j-]; //状态转移方程
if(!c[i][j])f[i][j]++;
}
f[i][i+]=f[i][i];
}
for(int i=;i<=t;++i){
int n=read(),m=read();
if(m>n)m=n;
write(f[n][m]);
putchar('\n');
}
return ;
}
P2822 组合数问题 HMR大佬讲解的更多相关文章
- P1313 计算系数 HMR大佬讲解
今天,HMR大佬给我们讲解了这一道难题. 这道题明显的二项式定理,自然想到了要用到杨辉三角了.基本思路就是先用for循环求出杨辉三角,这样就求出了x的n次方的系数和y的m次方的系数. 这是大佬的AC代 ...
- 洛谷P2822 组合数问题
输入输出样例 输入样例#1: 1 2 3 3 输出样例#1: 1 输入样例#2: 2 5 4 5 6 7 输出样例#2: 0 7 说明 [样例1说明] 在所有可能的情况中,只有C_2^1 = 2C21 ...
- P2822 组合数问题——巧用前缀和
P2822 组合数问题 求的是C(i,j)有多少个是k的倍数: 首先,求组合数是有技巧的, 用杨辉三角求组合数,爽的一批: 但是,这样只能得90分,两个点T了: 因为k是不变的,我们可以用前缀和的思想 ...
- Luogu P2822 组合数问题(前缀和)
P2822 组合数问题 题意 题目描述 组合数\(C_n^m\)表示的是从\(n\)个物品中选出\(m\)个物品的方案数.举个例子,从\((1,2,3)\)三个物品中选择两个物品可以有\((1,2), ...
- 洛谷P2822 组合数问题(题解)
https://www.luogu.org/problemnew/show/P2822(题目传送) 先了解一下有关组合数的公式:(m在上,n在下) 组合数通项公式:C(n,m)=n!/[m!(n-m) ...
- 【洛谷P2822 组合数问题】
题目连接 #include<iostream> #include<cstring> #include<cstdio> #include<cctype> ...
- P2822组合数问题
组合数问题(NOIP2016提高组Day2T1) Time Limit:1000MS Memory Limit:512000K [题目描述] 组合数表示的是从n个物品中选出m个物品的方案数.举个例子 ...
- 洛谷P2822组合数问题
传送门啦 15分暴力,但看题解说暴力分有30分. 就是找到公式,然后套公式.. #include <iostream> #include <cstdio> #include & ...
- 洛谷 P2822 组合数问题
题目描述 组合数C_n^mCnm表示的是从n个物品中选出m个物品的方案数.举个例子,从(1,2,3) 三个物品中选择两个物品可以有(1,2),(1,3),(2,3)这三种选择方法.根据组合数的 ...
随机推荐
- SDOI 2018划水记
Day0 最后一天啦,此时不颓更待何时? 上午10:15坐车从gryz出发,在一路颓废中到了农大 不得不说,农大的宾馆真的好高档啊,壁橱里面居然有保险柜!电视柜厨子里居然有冰箱!!冰箱里居然有饮料!! ...
- ArcGIS JavaScriptAPI----- 缓冲区操作
描述 使用ArcGIS Server 几何服务(geometry service)来对绘制在地图上的图形生成缓冲区.几何服务能够在基于浏览器的应用程序中执行缓冲操作(buffering),投影要素(p ...
- 二、IPC机制
1.Android IPC简介 IPC是Inter-Process Communication的缩写,含义为进程间通信或者跨进程通信,是指两个进程之间进行数据交换的过程. ANR:Applicatio ...
- Linux DNS服务配置
主.从域名服务器配置 一.实验环境 主域名服务器:ns1.topsec.com,192.168.120.119 从域名服务器:ns2.topsec.com,192.168.120.120 二.实验步骤 ...
- C++Primer第五版学习笔记
<C++ Primer>Learning Note 程序实例下载地址:http://www.informit.com/title/0321714113 第一章 开始 ...
- go语言学习-常用命令(四)
go常用命令 go get:获取远程包(得装git) go run:直接运行程序(写代码时调试用) go build:测试编译,检查是否有编译错误 go fmt:格式化代码(一般不咋用,IDE都自带了 ...
- 网络威胁实时地图(CyberThread Real-time Map)
今天跟大家分享一下网络威胁实时地图(CyberThread Real-time Map),从地图上可以看出目前网络威胁情况数据. 点击打开网络威胁实时地图 可以点击demo on/off来看演示.可以 ...
- Linux定是调用shell脚本删除文件
编写脚本 vi delbak.sh 代码如下: #!/bin/sh location="/home/mysql/backup/" find $location -mtime +7 ...
- 关于 pyspider Web预览界面太小的解决方法
本人最近在学习pyspider时,遇到Web预览界面太小而无法很好的进行开发,于是在网上搜索解决方法. 准备: css代码: body{margin:;padding:;height:%;overfl ...
- C#基础知识之字符串比较方法:“==”操作符;RefernceEquals;String.Equals方法;String.Compare方法;String.CompareOrdinal方法。
一.“==”操作符:String.Equals:ReferenceEquals 方法 1.在编程中实际上我们只需要这两种比较,c#中类型也就这两种 (1)值类型的比较:一般我们就是判断两个值类型实例各 ...