二项式定理学习

1.二项式定理

这个就是二项式定理的重要公式,我们的二项式定理的每一项的系数,代表的意思为从n个里面选出k个 ,以下是来自于百度百科上面的解释(原谅我实在不会数学定义)

因此我们可以去讨论二项式定理中的最特殊的一种形式——杨辉三角 

假设我们的a,b都是1,那么式子就是(1+1)^n,我们可以得出杨辉三角的形状

 

这样就是我们的杨辉三角,我们可以发现每一层的和恰好就是(1+1)^ i,(杨辉三角从第0层开始的) 

如果说,我们将元素都移到最左边对齐,我们会发现一个结论,著名的组合恒等式

也就是说 ,我们第i层第j列的元素,就是由其正上方的元素和正上方左边一个的元素累加得到

我们在处理二项式定理的问题的时候,最容易碰到的就是求C(n,k)的问题(就是从n个里面选k个的问题),我们有两种解决思路(当然了这种问题多半会有取模,因为数据很大,我们每个位置都会对数据进行取模)

第一种:我们可以通过打表的方法去打出杨辉三角的二维数组取模表,但是这种方法的时间复杂度高达O(n^2),只适用于小数据的问题

第二种:我们可以建立一个阶乘取模表,f[i]表示i的阶乘取模后的值是多少,然后建立一个逆元阶乘表,inv[i]表示i的阶乘的乘法逆元是多少,处理C(n,k)的问题直接调用公式即可.时间复杂度仅为O(n)

f[i]*inv[k]%mod*inv[n-k]%mod;

2.二项式定理的证明 

以下是直接从左神的视频上截的图,因为自己证明写起来太麻烦了,我也是比较懒的

 

 

 3.例题

P1313 [NOIP2011 提高组] 计算系数 

 怎么说呢?二项式定理水题吧,数据也没那么大,可以用上述说明的两种方法,先去求前面那个二项式系数C(k,m),然后快速幂去求a的n次方再乘以b的m次方,然后中间取模就好

#include<bits/stdc++.h>
using namespace std;
#define int long long
int a,b,k,n,m;
int f[1005][1005];
int mod=10007;
int fast(int a, int b) 
{long long result = 1;long long base = a;while (b > 0) {if (b % 2 == 1) {result = (result * base) % mod;}base = (base * base) % mod;b /= 2;}return result;
}signed main()
{cin>>a>>b>>k>>n>>m;for(int i=0;i<=1000;i++){f[i][0]=1;}for(int i=1;i<=1000;i++){for(int j=1;j<=i;j++){f[i][j]=(f[i-1][j]+f[i-1][j-1])%mod;}}cout<<f[k][m]*fast(a,n)%mod*fast(b,m)%mod;return 0;
}

P2822 [NOIP2016 提高组] 组合数问题

 

这题还是比较有意思的,一开始写的纯暴力,没有进行优化,导致了有些点T了,后面用了前缀和去优化才过的,我们看题可以发现,我们要寻找的是取模能够被k整除的,因此,我们在一开始打杨辉三角的表的时候,我们需要对每一个位置上的数都去取模k,然后开一个新的二维数组,如果当前杨辉三角的位置是0,那么那个记录数组的值就是1,否则就是0,然后我们仔细看题会发现,其实他给的数据已经规定好了去查找的矩形的右下角的位置,因此我们只需要用前缀和去处理一下值即可;

还有一个要注意的点就是,不是他给的m就一定可以达到的,如果m>n,那么右下角位置就是s[n][n],否则就是s[n][m];

#include<bits/stdc++.h>
using namespace std;
#define int long long
int t,k;
int n,m;
int f[2005][2005];
int c[2005][2005];
int s[2005][2005];//二维前缀和 
void solve()
{cin>>n>>m;if(m>n){cout<<s[n][n]<<"\n";}elsecout<<s[n][m]<<"\n";
}signed main()
{cin>>t>>k;f[0][0]=1;for(int i=1;i<=2000;i++){f[i][0]=1;}for(int i=1;i<=2000;i++){for(int j=1;j<=i;j++){f[i][j]=(f[i-1][j]+f[i-1][j-1])%k;}}for(int i=1;i<=2000;i++){for(int j=1;j<=i;j++){if(f[i][j]==0){c[i][j]=1;}else{c[i][j]=0;}}}for(int i=1;i<=2000;i++){for(int j=1;j<=2000;j++){s[i][j]=c[i][j]+s[i-1][j]+s[i][j-1]-s[i-1][j-1];}}while(t--){solve();}return 0;
} 

 3251. 单调数组对的数目 II

 

怎么说呢?这题其实来自于一个大厂面试题,当时数据范围已经卡死在n最大可以为1e7,因此当时那个题目必须要用到O(n)的时间复杂的算法,因此我们就用那题的数据来处理这个问题,这样以后碰到,心里就不会发怵了

这题我也是看到很多大犇都是用前缀和优化dp去解决的,但是我这个蒟蒻dp实在是太垃圾了,因此还是选择的用组合数学去实现的O(n)的时间复杂度的计算

我们假设一种特殊情况—— 数组里面的值都是同一个值

假设,数组里面都是同一个值,那么如果分割的时候,前面分割的值变大,那么后面那个数组能得到的值一定是变小的,因此我们可以将其变成图像来更好的处理

我们发现,我们的最大值能取到的就是5,横着最大能取到的就是4,也就是说,由于每个数都是一样的,所以我们最多走到(4,5)那个点,因此,最多走9步 ,我们在这9步中只有4步是向右走,因此我们的答案就是C(9,4)(从9个里面去选4个)

但是当我们如果并不是同一个数呢?我们该想一想这个问题 

我们首先要确定边界,我们的边界就是最后一个数,也就是nums[n-1](n是数组的长度),然后我们就该分析当前的数大于,等于,小于的时候分别会产生哪些后果。

假设a数组是第一个数组(非递减数组),b数组是第二个数组(非递增数组)

我们已知:a[i]>a[i-1]

因此:nums[i]-a[i]>=nums[i-1]-a[i-1]

得:a[i]>=max(a[i-1],nums[i]-nums[i-1]+a[i-1])

因此我们会发现如果当前位大于前一位的话,会导致必须要强行向上移动d步,d=nums[i]-nums[i-1]

如果强行移动的步数,大于标准m的话,那么将m归0

计算的时候计算C(m+n,n);

但是我们会发现这题数据非常的大,因此我们需要用到第二种方法,计算阶乘表,以及阶乘逆元表,然后就可以愉快的ac掉这个题了

long long f[3005];
long long inv[3005];
long long mod=1e9+7;
long long fast(int a, int b) 
{long long result = 1;long long base = a;while (b > 0) {if (b % 2 == 1) {result = (result * base) % mod;}base = (base * base) % mod;b /= 2;}return result;
}void ini()
{long long flag=1;f[0]=1;for(long long i=1;i<=3000;i++){f[i]=(f[i-1]*i)%mod;}inv[3000]=fast(f[3000],mod-2);for(long long i=3000;i>0;i--){inv[i-1]=(inv[i]*i)%mod;}return;
}long long solve(int n,int k)
{return f[n]*inv[k]%mod*inv[n-k]%mod;
}class Solution {
public:long long countOfPairs(vector<int>& nums) {ini();long long len=nums.size();long long m=nums[len-1];for(int i=1;i<len;i++){m-=max((long long)(nums[i]-nums[i-1]),0LL);if(m<0){return 0;}}long long ans=solve(m+len,len);return ans;}
};

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

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

相关文章

深入解析LlamaIndex Workflows【下篇】:实现ReAct模式AI智能体的新方法

之前我们介绍了来自LLM开发框架LlamaIndex的新特性&#xff1a;Workflows&#xff0c;一种事件驱动、用于构建复杂AI工作流应用的新方法&#xff08;参考&#xff1a;[深入解析LlamaIndex Workflows&#xff1a;构建复杂RAG与智能体工作流的新利器【上篇】]。在本篇中&#xff…

如何自制无人机?

自制无人机是一个既有趣又富有挑战性的项目&#xff0c;它涉及到电子工程、机械工程和航空航天工程等多个领域的知识。以下是一个基本的自制无人机制作步骤和所需材料概览&#xff0c;供您参考&#xff1a; 一、准备阶段 1. 明确目标 - 确定无人机的用途&#xff08;如航拍、…

基于SSM框架和Layui的学院课程安排系统的设计与实现(源码+定制+定制)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

Element UI教程:如何将Radio单选框的圆框改为方框

大家好&#xff0c;今天给大家带来一篇关于Element UI的使用技巧。在项目中&#xff0c;我们经常会用到Radio单选框组件&#xff0c;默认情况下&#xff0c;Radio单选框的样式是圆框。但有时候&#xff0c;为了满足设计需求&#xff0c;我们需要将圆框改为方框&#xff0c;如下…

SkyWalking 自定义链路追踪

对项目中的业务方法&#xff0c;实现链路追踪&#xff0c;方便我们排查问题 引入依赖 <!‐‐ SkyWalking 工具类 ‐‐> <dependency> <groupId>org.apache.skywalking</groupId> <artifactId>apm‐toolkit‐trace</artifactId> <vers…

【算法】博弈论(C/C++)

个人主页&#xff1a;摆烂小白敲代码 创作领域&#xff1a;算法、C/C 持续更新算法领域的文章&#xff0c;让博主在您的算法之路上祝您一臂之力 欢迎各位大佬莅临我的博客&#xff0c;您的关注、点赞、收藏、评论是我持续创作最大的动力 目录 博弈论&#xff1a; 1. Grundy数…

蓝牙模块(BT04/HC05)

目录 一、介绍 二、模块原理 1.原理图与外形尺寸 2.引脚描述 3.蓝牙模块基础AT指令介绍 三、程序设计 usart3.h文件 usart3.c文件 四、实验效果 五、资料获取 项目分享 一、介绍 BT04A是一款蓝牙低功耗&#xff08;Bluetooth Low Energy, BLE&#xff09;模块&…

继电保护之电压重动、电压并列和电压切换

实践&#xff1a;以某开关室10kV母联隔离柜为例&#xff1a; ZYQ-824为PT并列装置&#xff0c;装置内包含一系列继电器&#xff0c;用于PT重动及并列。按照装置编号原则&#xff0c;交流电压切换箱一般命名为7n。 ​下图为装置内继电器线圈部分接线&#xff1a; 下图为装置内…

Windows下的python安装教程_2024年10月最新最详细的安装指南

文章目录 前言一、下载python二、安装python三、验证环境四、配置环境变量&#xff08;可选&#xff09;总结 前言 Python 是一种广泛使用的高级编程语言&#xff0c;以其简洁易读的语法和强大的库支持而著称。无论你是初学者还是经验丰富的开发者&#xff0c;安装 Python 都是…

游戏盾是如何解决游戏行业攻击问题

随着游戏行业的迅猛发展&#xff0c;其高额的利润和激烈的市场竞争吸引了众多企业和创业者的目光。然而&#xff0c;这一行业也面临着前所未有的业务和安全挑战&#xff0c;尤其是DDoS&#xff08;分布式拒绝服务&#xff09;攻击&#xff0c;已经成为游戏行业的一大威胁。今天…

详解 SPI 机制

SPI(Service Provider Interface) 是 JDK 内置的一种服务提供发现机制&#xff1a;可以用来启用框架扩展和替换组件&#xff0c;主要用于框架中开发。例如&#xff1a;Dubbo、Spring、Common-Logging&#xff0c;JDBC 等都是采用 SPI 机制&#xff0c;针对同一接口采用不同的实…

基于SpringBoot博物馆游客预约系统【附源码】

基于SpringBoot博物馆游客预约系统 效果如下&#xff1a; 主页面 注册界面 展品信息界面 论坛交流界面 后台登陆界面 后台主界面 参观预约界面 留言板界面 研究背景 随着现代社会的快速发展和人们生活水平的提高&#xff0c;文化生活需求也在日益增加。博物馆作为传承文化、…

k8s 中的 PV 的动态供给

目录 1 存储类 Storageclass 介绍 1.1 StorageClass 说明 1.2 StorageClass 的属性 2 存储分配器 NFS Client Provisioner 2.1 官网存储分配器的部署介绍 2.2 实现动态创建 PV 模版清单文件的介绍 2.2.1 Storageclass 存储类的模版 2.2.2 创建 Provisioner 制备器的模版 2.2.3…

【Linux】文件IO系统[ 库函数 ]封装了[ 系统调用 ] +【区分文件结构体FILE和file与files_srtuct表】(读写接口盘点与介绍)

前言 大家好吖&#xff0c;欢迎来到 YY 滴Linux系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的《Lin…

世邦通信股份有限公司IP网络对讲广播系统RCE

漏洞描述 SPON世邦IP网络广播系统采用的IPAudio™技术, 将音频信号以数据包形式在局域网和广域网上进行传送&#xff0c;是一套纯数字传输的双向音频扩声系统。传统广播系统存在的音质不佳&#xff0c;传输距离有限&#xff0c;缺乏互动等问题。该系统设备使用简便&#xff0c…

AAA Mysql与redis的主从复制原理

一 &#xff1a;Mysql主从复制 重要的两个日志文件&#xff1a;bin log 和 relay log bin log&#xff1a;二进制日志&#xff08;binnary log&#xff09;以事件形式记录了对MySQL数据库执行更改的所有操作。 relay log&#xff1a;用来保存从节点I/O线程接受的bin log日志…

界面控件DevExpress中文教程 - 如何拓展具有AI功能的文本编辑器(一)

本文重点介绍了DevExpress在近年来最热门领域——人工智能(AI)和自然语言处理(NLP)的改进&#xff01; NLP是人工智能的一个分支&#xff0c;它允许计算机与人类语言进行交互&#xff0c;这包括以有意义/有用的方式理解、解释、生成和回应文本(和语音)的能力。基于NLP的功能允…

仿RabbitMQ实现消息队列客户端

文章目录 客⼾端模块实现订阅者模块信道管理模块异步⼯作线程实现连接管理模块生产者客户端消费者客户端 客⼾端模块实现 在RabbitMQ中&#xff0c;提供服务的是信道&#xff0c;因此在客⼾端的实现中&#xff0c;弱化了Client客⼾端的概念&#xff0c;也就是说在RabbitMQ中并…

认知战认知作战:激发认知战战术分享热情的秘诀

认知战认知作战&#xff1a;激发认知战战术分享热情的秘诀 认知战认知作战&#xff1a;激发认知战战术分享热情的秘诀 关键词&#xff1a;认知战, 认知作战, 创造独特体验, 融入社交元素, 情感共鸣策略, 分享激励机制, 战略形象塑造, 个性化内容推荐,认知作战,新质生产力,人类…

E. Tree Pruning Codeforces Round 975 (Div. 2)

原题 E. Tree Pruning 解析 本题题意很简单, 思路也很好想到, 假设我们保留第 x 层的树叶, 那么对于深度大于 x 的所有节点都要被剪掉, 而深度小于 x 的节点, 如果没有子节点深度大于等于 x, 那么也要被删掉 在做这道题的时候, 有关于如何找到一个节点它的子节点能通到哪里,…