求组合数I(acwing)

news2024/10/6 6:40:00

题目描述:

     给定n组询问,每组询问给定两个整数a,b,请你输出Ca^b mod(1e9+7)的值。

输入格式:
     第一行包含整数n。
     接下来n行,每行包含一组a和b。

输出格式:
      共n行,每行输出一个询问的解。

数据范围:
      1≤n<10000
      1<b<a<2000
输入样例:

3
3 1
5 3
2 2

输出样例:

3
10
1

分析步骤:

  第一:这道题目很明显就是要我们求一个式子,观察我们的数据范围,a和b最大是2000所以我们如果用for循环的话时间复杂度就是O(n^2),也就是4e6完全可以计算出来,所以我们直接选择for循环将其计算出来。

  第二:我们看到这道题是求组合数,例如在8个苹果里面选择2个也就是C8^2。我们可以想一下我们是如何手算这个答案的。我们分子是8*7,分母是2*1将他们的答案相除,得出的答案就是我们的答案。如果我们推广到Cn^k的话我们又如何计算呢?分子是(n!),分母是(k!*(n-k)!),这应该在初中应该已经学过了吧,比如C8^2我们可以计算成分子是(8!),分母是(2!*(8-2)!)我们这个(8-2)!答案刚好可以和8!的阶乘的后面一段抵消。

  第三:我们求Cn^k可以相当于求Cn-1^k + Cn-1^(k-1)。因为我们从n个苹果里面选好一个,假设之后的要选的苹果不包含这个苹果的话,就相当于在n-1的苹果的范围内选出k个苹果如果包含之后要选择的苹果包含了这个苹果,那么就相当于在n-1的范围内选择k-1个苹果。然后我们利用递归就能求出任意的答案了!大家仔细想想!

  第四:书写主函数,构建整体框架

  • 首先初始化我们的组合数,将所有的组合数都求出来。

  • 输入值,利用while函数不断的输入新的值,由于我们已经初始化,从而得出了我们的答案

  • 所以直接输出c[a][b]

  第五:初始化我们的组合数答案:

  • 我们利用之前分析得出的两层for遍历,第一层范围是从0到N;第二层范围是从0到i因为j绝对不可能大于i的

  • 如果j == 0的话,就相当于我们从i个苹果中选择0个所以方案就是只有1种

  • 如果j != 0的话,c[i][j] = c[ i - 1 ][ j ] + c[ i - 1 ][ j - 1 ]就可

void init(){
     for(int i = 0 ; i < N ; i ++){
         for(int j = 0 ; j <= i ; j++){
             if(!j) c[i][j] = 1 ;
             else{
                 c[i][j] = (c[i-1][j] + c[i-1][j-1]) % mod;
             }
         }
     }
}

代码:

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;
const int N = 2010 , mod = 1e9 + 7;
int n ;
int c[N][N];

void init(){
     for(int i = 0 ; i < N ; i ++){
         for(int j = 0 ; j <= i ; j++){
             if(!j) c[i][j] = 1 ;
             else{
                 c[i][j] = (c[i-1][j] + c[i-1][j-1]) % mod;
             }
         }
     }
}

int main()
{
    init();
    cin>>n;
    while(n--){
        int a , b ; 
        cin>>a>>b;
        cout<<c[a][b]<<endl;
    }
    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++刷题篇——05静态扫描

一、题目 二、解题思路 注意&#xff1a;注意理解题目&#xff0c;缓存的前提是先扫描一次 1、使用两个map&#xff0c;两个map的key相同&#xff0c;map1&#xff1a;key为文件标识&#xff0c;value为文件出现的次数&#xff1b;map2&#xff1a;key为文件标识&#xff0c;va…

Navicat设置mysql权限

新建用户&#xff1a; 注意&#xff1a;如果不生效执行刷新命令:FLUSH PRIVILEGES; 执行后再重新打开查看&#xff1b; 查询权限命令&#xff1a;1234为新建的用户名&#xff0c;localhost为访问的地址 SHOW GRANTS FOR 1234localhost;如果服务器设置服务器权限后可能会出现权…

【Docker】搭建安全可控的自定义通知推送服务 - Bark

【Docker】搭建安全可控的自定义通知推送服务 - Bark 前言 本教程基于绿联的NAS设备DX4600 Pro的docker功能进行搭建。 简介 Bark是一款为Apple设备用户设计的开源推送服务应用&#xff0c;它允许开发者、程序员以及一般用户将信息快速推送到他们自己的iPhone、iPad等设备上…

副业赚钱攻略:给工资低的你6个实用建议,闷声致富不是梦

经常有朋友向我咨询&#xff0c;哪些副业比较靠谱且能赚钱。实际上&#xff0c;对于大多数打工族而言&#xff0c;副业不仅是增加收入的途径&#xff0c;更是利用业余时间提升自我、实现价值的重要方式。 鉴于此&#xff0c;今天我想和大家分享六个值得尝试的副业&#xff0c;…

linux:生产者消费者模型

个人主页 &#xff1a; 个人主页 个人专栏 &#xff1a; 《数据结构》 《C语言》《C》《Linux》 文章目录 前言一、生产者消费者模型二、基于阻塞队列的生产者消费者模型代码实现 总结 前言 本文是对于生产者消费者模型的知识总结 一、生产者消费者模型 生产者消费者模型就是…

Java封装最佳实践:打造高内聚、低耦合的优雅代码~

​ 个人主页&#xff1a;秋风起&#xff0c;再归来~ 文章专栏&#xff1a;javaSE的修炼之路 个人格言&#xff1a;悟已往之不谏&#xff0c;知来者犹可追 克心守己&#xff0c;律己则安&#xff01; 1、封装 1.1 封装的概念 面向对象程序三大…

数据类型和变量的深入理解

引言&#xff1a;C语言数据类型的意义&#xff0c;数据在内存中的存储情况&#xff0c;变量的声明与定义的区别&#xff0c;和一些关键字。 目录 1.变量的定义与声明 1.1定义与声明 1.2 变量的初始化与赋值 2.C语言常见的数据类型 3.变量的作用域与生命周期 4.signed 和 un…

SpringBoot mybatis-starter解析

mybatis-starter使用指南 自动检测工程中的DataSource创建并注册SqlSessionFactory实例创建并注册SqlSessionTemplate实例自动扫描mappers mybatis-starter原理解析 注解类引入原理 查看对应的autoconfigure包 MybatisLanguageDriverAutoConfiguration 主要是协助使用注解来…

Leetcode 4.1

LeetCode 热题 100 贪心算法1.买卖股票的最佳时机2.跳跃游戏3.跳跃游戏 II4.划分字母区间 区间合并1.合并区间 贪心算法 1.买卖股票的最佳时机 买卖股票的最佳时机 买的那天一定是卖的那天之前的最小值。 每到一天&#xff0c;维护那天之前的最小值即可。 在题目中&#xff0…

红米手机Redmi 不会自动弹出USB调试选项,如何处理?(红米小米均适用)

参考&#xff1a; 红米手机Redmi 不会自动弹出USB调试选项&#xff0c;如何处理&#xff1f;&#xff08;红米小米均适用&#xff09; - 知乎 以红米9A为例&#xff1b; 【设置】菜单进入后&#xff0c;找到【我的设备】&#xff0c; 选择【全部参数】&#xff0c; 对准miui版…

npm ERR! code CERT_HAS_EXPIRED 淘宝镜像失效

近期vue安装失败&#xff0c;具体如下&#xff1a; 1.先npm cache clean --force 再下载 插件后缀加上 --legacy-peer-deps 2.certificate has expired npm ERR! code CERT_HAS_EXPIRED npm ERR! errno CERT_HAS_EXPIRED npm ERR! request to https://registry.npm.taobao.o…

【面试题】RocketMQ怎么处理消息积压?

如图,消息积压主要是因为&#xff0c;消费能力不足&#xff1a; 在RocketMQ中&#xff0c;处理消息积压的方法可以采取以下几种策略&#xff1a; 增加消费者数量&#xff1a;可以通过增加消费者数量来提高消息的消费速度。通过增加消费者实例或者消费者组的数量&#xff0c;可…

【Consul】Linux安装Consul保姆级教程

【Consul】Linux安装Consul保姆级教程 大家好 我是寸铁&#x1f44a; 总结了一篇【Consul】Linux安装Consul保姆级教程✨ 喜欢的小伙伴可以点点关注 &#x1f49d; 前言 今天要把编写的go程序放到linux上进行测试Consul服务注册与发现&#xff0c;那怎么样才能实现这一过程&am…

Layui三级联动插件使用方法

Layui高版本中没有在提供三级联动这个动画了&#xff0c;而是封装成了一个插件&#xff0c;使用方式也很简单 官网 省市县区三级联动下拉选择器 layarea - Layui 第三方扩展组件平台 (layuion.com)https://dev.layuion.com/extend/layarea/#doc html页面约束 整个选择器需要…

【二叉树】Leetcode 101. 对称二叉树【简单】

对称二叉树 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true 解题思路 判断一棵二叉树是否是轴对称的&#xff0c;可以通过递归方式进行判断。 1、定义一个递归函数isMirr…

【C++】C++入门第二课(函数重载 | 引用 | 内联函数 | auto关键字 | 指针空值nullptr)

目录 前言 函数重载 概念 重载函数的条件 C支持重载函数的原理--名字修饰 引用 概念 特性 常引用&#xff08;const引用&#xff09; 使用场景 传值&#xff0c;传引用效率比较 引用和指针的区别 内联函数 概念 特性 auto关键字&#xff08;C11&#xff09; a…

javaWeb项目-家政服务管理系统功能介绍

项目关键技术 开发工具&#xff1a;IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架&#xff1a;ssm、Springboot 前端&#xff1a;Vue、ElementUI 关键技术&#xff1a;springboot、SSM、vue、MYSQL、MAVEN 数据库工具&#xff1a;Navicat、SQLyog 1、B/S结构简介 B/S…

OpenHarmony实战:使用宏、std::bind 巧妙实现进出函数日志打印

背景 我们始终渴望了解模块的调用、时序逻辑&#xff0c;每个人都会轻易地想到在函数的入口打印一条进入 enter 相关的日志&#xff0c;在函数的出口打印一条离开 leave 相关的日志。不能有遗漏&#xff0c;我们会复制这条日志到所有关心的函数中&#xff0c;为了表明是哪个模…

网络以太网之(1)基础概念

网络以太网之(1)基础概念 Author: Once Day Date: 2024年4月1日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文档可参考专栏&#xff1a;通信网络技术_Once-Day的…

EI会议相当于国内什么期刊?

EI工程索引收录类型有EI期刊和EI会议&#xff0c;EI会议水平是比较高的&#xff0c;也有的作者喜欢将EI会议与国内刊物作比较&#xff0c;那么EI会议相当于国内什么期刊&#xff1f;这主要看是什么级别的会议&#xff0c;顶尖学术会议相当于国内北大核心期刊。 EI会议应用范围和…