洛谷P2822:组合数问题 ←(帕斯卡法则+取模+前缀和)

news/2024/5/20 23:01:27/文章来源:https://blog.csdn.net/hnjzsyjyj/article/details/130001441

【题目来源】
https://www.luogu.com.cn/problem/P2822

【题目描述】
组合数C^m_n​表示的是从n个物品中选出m个物品的方案数。举个例子:从(1,2,3)三个物品中选择两个物品可以有(1,2),(1,3),(2,3) 这三种选择方法。根据组合数的定义,我们可以给出计算组合数的一般公式:
C^m_n=\frac{n!}{m!(n-m)!} 
其中n!=1\times2\times\cdots\times n。特别地,定义0!=1。
小葱想知道如果给定n,m和k,对于所有的0≤i≤n,0≤j≤min(i,m),有多少对 (i,j) 满足C_i^j​是k的倍数,即满足k整除C^m_n,也就是k|C^j_i

【输入格式】
第一行有两个整数 t,k,其中 t 代表该测试点总共有多少组测试数据。
接下来 t 行,每行两个整数 n,m。

【输出格式】
共 t 行,每行一个整数代表所有的 0\leq i\leq n,0\leq j\leq \min \left ( i, m \right )中有多少对 (i,j) 满足 k|C^j_i

【算法分析】
本题可采用如下方法进行优化。
1.Pascal's Rule(帕斯卡法则):{\color{Red} C^m_n=C^m_{n-1}+C^{m-1}_{n-1}}
2.取模运算规则:https://www.lmlphp.com/user/56/article/item/3205/
本题用到的取模运算规则:{\color{Red} (a + b) % p = (a % p + b % p) % p}
3.前缀和:
https://blog.csdn.net/hnjzsyjyj/article/details/120265452
前缀和,无论是一维前缀和还是二维前缀和,通常都用于快速计算区间和。它们的思想都是利用给定的数据预先处理出一个前缀和数组,之后在计算区间和的时候查表,从而可以大大降低算法的时间复杂度
一维前缀和数组预处理过程:
sum[i]=sum[i-1]+a[i]
一维区间和计算过程:sum[y]-sum[x-1]     (y≥x)
二维前缀和数组预处理过程:
sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+a[i][j]
二维区间和计算过程:sum[x2][y2]-sum[x1-1][y2]-sum[x2][y1-1]+sum[x1-1][y1-1]     (y2≥y1,x2≥x1)  

二维前缀和示意图如下所示。其中绿色区域是保留区域,红色双箭头经过的区域为删除区域。

为了方便记忆,给出二维前缀和的计算公式的助记示意图。如下所示。


 

【算法代码】

#include <bits/stdc++.h>
using namespace std;const int maxn=2005;
int c[maxn][maxn];
int s[maxn][maxn];
int ans[maxn][maxn];int t,k,n,m;int main() {cin>>t>>k;for(int i=1; i<maxn; i++) {c[i][0]=1;c[i][i]=1;for(int j=1; j<i; j++)c[i][j]=(c[i-1][j]+c[i-1][j-1])%k;}for(int i=1; i<maxn; i++)for(int j=1; j<=i; j++) {s[i][j]=s[i][j-1];if(c[i][j]==0) s[i][j]++;}for(int cnt=1; cnt<=t; cnt++) {cin>>n>>m;int ans=0;for(int i=1; i<=n; i++) {int j=min(i,m);ans+=s[i][j];}cout<<ans<<endl;}return 0;
}/*
in:
2 5
4 5
6 7out:
0
7
*/




【参考文献】
https://www.luogu.com.cn/problem/P2822
https://www.cnblogs.com/OIerShawnZhou/p/7518444.html

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_283410.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

属性配置的宏(修改宏IntDir)

项目属性页码 拷贝下 常见宏列表 下表描述了可用宏的常用子集&#xff1b;还有很多没有在这里列出。 转到“宏”对话框&#xff0c;查看项目中的所有属性及其当前值。 有关如何创建 MSBuild 属性定义以及如何在 .props、.targets 和 .vcxproj 文件中将其用作宏的详细信息&am…

面向对象编程(进阶)7:面向对象特征三:多态性

一千个读者眼中有一千个哈姆雷特。 目录 7.1 多态的形式和体现 7.1.1 对象的多态性 举例&#xff1a; 7.1.2 多态的理解 7.1.3 举例 1、方法内局部变量的赋值体现多态 2、方法的形参声明体现多态 3、方法返回值类型体现多态 7.2 为什么需要多态性(polymorphism)&#x…

登录认证功能的实现

1.登录校验分析 什么是登录校验&#xff1f; 所谓登录校验&#xff0c;指的是我们在服务器端接收到浏览器发送过来的请求之后&#xff0c;首先我们要对请求进行校验。先要校验一下用户登录了没有&#xff0c;如果用户已经登录了&#xff0c;就直接执行对应的业务操作就可以了…

C语言头文件路径相关问题总结说明

聊聊系统路径位置&#xff0c;绝对路径与相对路径&#xff0c;正斜杠 / 与 反斜杠 \ 使用说明 ...... by 矜辰所致目录前言一、C语言中的头文件引用二、KEIL 中的头文件路径2.1 IncudePaths 指定的路径绝对路径和相对路径正斜杠 / 与 反斜杠 \ 与双斜杠2.2 include < >…

VN5620以太网测试——环境搭建篇

文章目录 前言一、新建以太网工程二、Port Configuration三、Link up四 Trace界面五、添加Ethernet Packet Builder六、添加ARP Packet七、添加Ethernet IG总结前言 CANoe(CAN open environment)VN5620 :是一个紧凑而强大的接口,用于以太网网络的分析、仿真、测试和验证。 …

页面预加载优化实践

概述在客户端开发中&#xff0c;列表类型页面大多都依赖网络请求&#xff0c;需要等网络数据请求下来后再刷新页面。但遇到网络请求慢的场景&#xff0c;就会导致页面加载很慢甚至加载失败。我负责会员的商品列表页面&#xff0c;在业务场景中&#xff0c;页面元素比较复杂&…

初学对象存储OSS---学习笔记

文章目录前言一、OSS是什么&#xff1f;下面以一个小故事介绍OSS的作用&#xff1a;二、怎么使用OSS1.进入 -----> [阿里云官网](https://www.aliyun.com/)2.点击进入OSS控制台3.获取accessKeyId 和 accessKeySecret4.拿到了accessKeyId 和 accessKeySecret &#xff0c;就可…

[Netty] Netty与Os的零拷贝 (五)

1.Netty的零拷贝原理 Netty接收和发送ByteBuffer采用DirectBuffer&#xff0c;使用堆外直接内存进行Socket读写&#xff0c;不需要进行字节缓冲区的二次拷贝。如果使用传统的JVM的堆内存&#xff08;Heap Buffer&#xff09;进行socker读写&#xff0c;那么JVM将会将堆内存拷贝…

javaScript---理解异步

目录 同步与异步 进程和线程 JS单线程 定时器 同步与异步 同步&#xff1a;调用之后得到结果再干别的任务。 异步&#xff1a;调用之后先不管结果&#xff0c;继续干别的任务。 进程和线程 进程&#xff08;process&#xff09;程序运行的实例&#xff0c;同一个程序可以产生多…

RestClient操作文档

RestClient操作文档5.RestClient操作文档5.1.新增文档5.1.1.索引库实体类5.1.2.语法说明5.1.3.完整代码5.2.查询文档5.2.1.语法说明5.2.2.完整代码5.3.删除文档5.4.修改文档5.4.1.语法说明5.4.2.完整代码5.5.批量导入文档5.5.1.语法说明5.5.2.完整代码5.6.小结5.RestClient操作…

多测合一生产软件SISS教程大全

下载&#xff1a; 在这里插入代码片产品介绍&#xff1a; 不动产权籍调查测绘软件RESS是南方数码针对不动产权籍调查测绘工作研发的一款专业的数据处理软件&#xff0c;融合了业内主流测绘软件&#xff08;南方数码地形地籍成图软件CASS和新一代房测之友BMFse&#xff09;的核…

C++ 一些在工作中遇到的小问题的c++解决脚本程序,记录用的

文章目录前言1 从"txt"文件中读取数组2 线性插值生成数组后存入“.txt”文件前言 本博客用于记录在工作中遇到的一些C小脚本。 1 从"txt"文件中读取数组 txt内文本如下图所示&#xff0c;按行记录数据&#xff0c;每组数据包含第一列为Index即索引号&…

【学习提高】JVM垃圾收集器,垃圾回收算法,一个对象从创建到回收的过程。

1、JVM垃圾收集器 不同的垃圾回收器&#xff0c;适用于不同的场景。常用的垃圾回收器&#xff1a;   串行&#xff08;Serial&#xff09;回收器是单线程的一个回收器&#xff0c;简单、易实现、效率高。   并行&#xff08;ParNew&#xff09;回收器是Serial的多线程版&…

面向对象编程(基础)1:面向对象思想精髓的理解

目录 1. 面向对象编程概述(了解) 1.1 程序设计的思路 1. 面向过程的程序设计思想&#xff08;Process-Oriented Programming&#xff09;&#xff0c;简称POP 2. 面向对象的程序设计思想&#xff08; Object Oriented Programming&#xff09;&#xff0c;简称OOP 1.2 由实…

在Android Studio通过adb命令强制安装debug版本apk到手机,且允许version code降级

在Android Studio通过adb命令强制安装debug版本apk到手机&#xff0c;且允许version code降级 切换到Terminal&#xff1a; adb install -t -d -r -g .\app\build\intermediates\apk\debug\app-arm64-v8a-debug.apk .\app\build\intermediates\apk\debug\是android studio的…

使用vue-element-admin定制化构建测试平台

基础环境搭建 vue-element-admin环境搭建 直接下载 https://gitee.com/constfiv/vue-element-admin-fix-install-problem&#xff0c;相比于https://github.com/PanJianChen/vue-element-admin.git的版本&#xff0c;这个版本好很多&#xff0c;npm intsall不会有各种依赖的问…

安装Jupyter notebook,修改Jupyter notebook打开路径,虚拟环境,以及Jupyter notebook基本操作

一、经过以下步骤你可以实现在虚拟环境中安装jupyter notebook&#xff0c;以及启动jupyter notebook。 创建虚拟环境 conda create -n demo python3.9激活虚拟环境 conda activate demo虚拟环境中安装jupyter notebook conda install jupyter notebook启动jupyter noteboo…

LeetCode 1040. Moving Stones Until Consecutive II【排序,滑动窗口,双指针】中等

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…

ASEMI代理AD8226ARZ-R7原装ADI车规级AD8226ARZ-R7

编辑&#xff1a;ll ASEMI代理AD8226ARZ-R7原装ADI车规级AD8226ARZ-R7 型号&#xff1a;AD8226ARZ-R7 品牌&#xff1a;ADI/亚德诺 封装&#xff1a;SOIC-8 批号&#xff1a;2023 引脚数量&#xff1a;8 安装类型&#xff1a;表面贴装型 AD8226ARZ-R7汽车芯片 AD8226A…

Android 开发永远逃不了Framework魔抓~

不管你是做手机系统开发还是APP开发&#xff0c;Framework层你肯定会碰到。除非你所做的事情只是UI的优化。 所以在面试途中&#xff0c;也会少不了面试官对你所掌握的Framework 层的水准进行检测&#xff0c;而一般常见的Android Framework连环炮面试问题有这些&#xff1a; …