数学知识:求组合数

 求组合数 I:

注意:1~1w组数据

#include<iostream>
using namespace std;const int mod = 1e9+7;
long long f[2010][2010];int main()
{int n;scanf("%d",&n);//预处理for(int i=0;i<=2000;i++){for(int j=0;j<=i;j++){if(!j) f[i][j]=1;else f[i][j]=(f[i-1][j-1]+f[i-1][j])%mod;//如上图公式所得}}while(n--){int a,b;scanf("%d%d",&a,&b);printf("%lld\n",f[a][b]);}
}

求组合数 II:

注意:1~10w组数据

#include<iostream>
using namespace std;const int mod=1e9+7,N=1e5+10;
typedef long long LL;
long long fac[N],infac[N];//fac[N]阶乘mod p的值,infac[N]阶乘的逆元mod p的值int quick_pow(int a, int k, int p)//快速幂求逆元
{int res = 1;while (k)//对k进行二进制化,从低位到高位{//如果k的二进制表示的第0位为1,则乘上当前的aif (k & 1) res = (LL)res * a % p;//k右移一位k >>= 1;//更新aa = (LL)a * a % p;}return res;//a:4 b:3 p:9
//二进制b   11        1//res 1*4%9=4   4*7%9=1     //b   1         0        //a   4*4%9=7   16*16%9=112//因为:2^0=1,2^1=2,2^2=4,2^3=8...//根据公式:b=3,所以2^0+2^1=b,与这个指数上面的b算的一样//所以(4^2^0%9*4^2^1%9)%9=(4*7)%9=28%9=1,这个就是上面的res
}int main()
{int n;fac[0]=infac[0]=1;for(int i=1;i<=1e5;i++){fac[i]=fac[i-1]*i%mod;//i的阶乘就是上一个阶乘*iinfac[i]=(LL)infac[i - 1] * quick_pow(i,mod-2,mod)%mod;//i的逆元阶乘就是上一个数的逆元阶乘*i的逆元}scanf("%d",&n);while(n--){int a,b;scanf("%d%d",&a,&b);printf("%lld\n",(LL)fac[a] * infac[b] % mod * infac[a - b] % mod);//由上图公式得}
}

求组合数 III:

注意:1~20w组数据

#include<iostream>
#include<algorithm>using namespace std;typedef long long LL;int qmi(int a,int k,int p)//快速幂求逆元
{int res = 1;while(k){//如果k的二进制表示的第0位为1,则乘上当前的aif(k&1)res = (LL)res*a%p;//k右移一位k>>=1;//更新aa = (LL)a*a%p;}return res;
}int C(int a,int b,int p)//自变量类型int
{if(b>a)return 0;//边界条件int res = 1;// a!/(b!*(a-b)!) = (a-b+1)*...*a / b! 分子有b项,这是组合公式for(int i=1,j=a;i<=b;i++,j--)//图二所示公式,递推的每次乘a然后除以b, 因为从a到a−b+1, 所以就是乘b次{res = (LL)res*j%p;//乘a,此时a就是jres = (LL)res*qmi(i,p-2,p)%p;//除以b,就是*b的逆元,此时i就是b}return res;
}
//对公式敲
int lucas(LL a,LL b,int p)
{if(a<p && b<p)return C(a,b,p);//lucas递归终点是C()return (LL)lucas(a/p,b/p,p)*C(a%p,b%p,p)%p;//这是lucas公式,也是最后需要的答案,a%p后肯定是<p的,所以可以用C(),但a/p后不一定<p 所以用lucas继续递归
}int main()
{int n;scanf("%d",&n);while(n--){LL a,b;int p;scanf("%lld%lld%d",&a,&b,&p);printf("%d\n",lucas(a,b,p));}return 0;
}

求组合数 IV:

注意:答案可能很大,需要使用高精度计算

#include<iostream>
#include<algorithm>
#include<vector>using namespace std;const int N=5010;int primes[N],cnt;//primes[N]用来存放质数,cnt代表质数的个数
int sum[N];//每个质数的次方
bool st[N];//st[i], i为质数则为false否则为true,默认全是质数void get_primes(int n)//线性筛质数,即筛出每个p
{for(int i=2;i<=n;i++)//i是某个数的意思,要找2~n的所有数是否为质数{if(!st[i])primes[cnt++]=i;//如果i该数是质数,则放进数组,cnt++代表质数个数加一for(int j=0;primes[j]<=n/i;j++)//把小于n的合数都筛了{st[primes[j]*i]=true;//i无论是质数还是合数,它的质数倍数都可以赋true//例:i=2时,找到i的最小质因子为2,所以2*2=4被赋true//    i=3时,找到i的最小质因子为3,所以3*3=9被赋true//    i=4时,前面已经找到4为合数所以不会让上面的if出错//像这样,不会让任何i和合数的情况下未被赋true,而导致上面的if出错//当primes[j]是i的最小质因子,说明primes[j]一定是i的倍数primes[j]*i的最小质因子//则说明对于i的倍数primes[j+k]*i的最小质因子也是primes[j],而非primes[j+k]//后面的任何i的倍数都不用看了,直接break,让i++找下一个数是否为质数//当i%primes[j]!=0时,说明此时遍历到的primes[j]不是i的质因子,所以primes[j]*i的最小质因子不是primes[j]//可以继续找primes[j+k]的i倍是否为最小质因子if(i%primes[j]==0)break;}}
}
//计算n的阶乘中<=n的p的指数最大为多少,如2,2^2,2^3...,算最大为几次方
int get(int n,int p)
{int res =0;while(n){res+=n/p;n/=p;}return res;
}
//高精度乘法把所有质因子乘起来
vector<int> mul(vector<int> a, int b)
{vector<int> c;int t = 0;for (int i = 0; i < a.size() || t; i++)//只要有进位或者A没读完,就继续{if (i < a.size())t += a[i] * b;//乘法,A是低位在前,所以先算的低位c.push_back(t % 10);//把余数放进来t /= 10;//给下一位的进位}return c;
}int main()
{int a,b;scanf("%d%d",&a,&b);get_primes(a);//找到1~a的所有质数for(int i=0;i<cnt;i++)//把所有的质数算出a的阶乘中该质数的最大次方为多少{int p = primes[i];//当前i这个数包含的p的个数=a的阶乘的p的个数-(a-b)的阶乘的p的个数-b的阶乘的p的个数//用分子里面 p 的次方减去分母里面 p 的次方。这里的计算组合数的公式为a!/(b!*(a-b)!),因此用 a 里面 p 的次方减去 b 里面 p 的次方和 (a-b) 里面 p 的次方。sum[i] = get(a,p)-get(a-b,p)-get(b,p);//是a-b不是b-a}vector<int> res;res.push_back(1);for (int i = 0; i < cnt; i ++ )//每个质数for (int j = 0; j < sum[i]; j ++ )//primes[i]的次方,即每个质数的次方res = mul(res, primes[i]);//高精度乘法for (int i = res.size() - 1; i >= 0; i -- ) printf("%d", res[i]);printf("\n");return 0;
}

满足条件的01序列:

将 01 序列置于坐标系中,起点定于原点。若 0 表示向右走,1 表示向上走,那么任何前缀中 0 的个数不少于 1的个数就转化为,路径上的任意一点,横坐标大于等于纵坐标。题目所求即为这样的合法路径数量。

答案如图,即卡特兰数。

#include <iostream>
using namespace std;typedef long long LL;const int N = 200010, mod = 1e9 + 7;int n;
int fact[N], infact[N];//fac[N]阶乘mod p的值,infac[N]阶乘的逆元mod p的值int ksm(int a, int k,int mod) //快速幂求逆元
{int res = 1;while (k) //对k进行二进制化,从低位到高位{if (k & 1) res = (LL)res * a % mod;//如果k的二进制表示的第0位为1,则乘上当前的ak >>= 1;//k右移一位a = (LL)a * a % mod;//更新a}return res;//a:4 b:3 p:9
//二进制b   11        1//res 1*4%9=4   4*7%9=1     //b   1         0        //a   4*4%9=7   16*16%9=112//因为:2^0=1,2^1=2,2^2=4,2^3=8...//根据公式:b=3,所以2^0+2^1=b,与这个指数上面的b算的一样//所以(4^2^0%9*4^2^1%9)%9=(4*7)%9=28%9=1,这个就是上面的res
}int main() 
{fact[0] = infact[0] = 1;for (int i = 1; i < N; i++) {fact[i] = (LL)fact[i - 1] * i % mod;//i的阶乘就是上一个阶乘*iinfact[i] = (LL)infact[i - 1] * ksm(i, mod - 2,mod) % mod;//i的逆元阶乘就是上一个数的逆元阶乘*i的逆元}scanf("%d",&n);//由卡特兰公式:2n!/n!/n!/n+1,这里的除以n+1可以写成乘以n+1的逆元int res = (LL)fact[2 * n] * infact[n] % mod * infact[n] % mod * ksm(n + 1, mod - 2,mod) % mod;printf("%d\n",res);return 0;
}

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

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

相关文章

力扣每日一题80:删除有序数组中的重复项||

题目描述&#xff1a; 给你一个有序数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使得出现次数超过两次的元素只出现两次 &#xff0c;返回删除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的…

管网智慧化建设能为管网提供哪些优势?第3点特别值得注意!

关键词&#xff1a;智能管网、智慧管网、智慧管网建设、智慧燃气、气管网压力监测解决方案 随着信息技术的不断发展&#xff0c;数字城市的发展正在快速向智慧城市推进&#xff0c;而管网智慧化建设是目前智慧城市建设中不可或缺的一个重要举措。 因为早期铺设使用的排水管道…

MathType2024破解版激活序列号

MathType序列号是一款针对该软件而制作的激活工具&#xff0c;大家都知道这款软件在官方是需要花钱购买的&#xff0c;不然得话就只能试用。有很多功能都无法正常使用&#xff01;而本序列号却可以完美的解决这一难题&#xff0c;因为它可以破解并激活“MathType”&#xff0c;…

Android WMS——Dialog和Toast窗口创建(五)

前面文章介绍了 Activity 窗口创建的流程,这里我们在看一下 Dialog 和 Toast 窗口创建的流程。 一、Dialog窗口创建 Dialog 中创建 Window 是在其构造方法中完成。 1、Dialog显示 源码位置:/frameworks/base/core/java/android/app/Dialog.java private final WindowMana…

java实现下载文件压缩包

业务背景&#xff1a; 在开发过程中&#xff0c;我们会遇到需要对文件&#xff08;单个或多个&#xff09;进行压缩并下载的功能需求&#xff0c;这里记录一下压缩多个文件的实现过程&#xff0c;或许有更好的方式请大家补充 前端实现一个按钮调下载压缩包的接口 <button…

jenkins、ant、selenium、testng搭建自动化测试框架

如果在你的理解中自动化测试就是在eclipse里面讲webdriver的包引入&#xff0c;然后写一些测试脚本&#xff0c;这就是你所说的自动化测试&#xff0c;其实这个还不能算是真正的自动化测试&#xff0c;你见过每次需要运行的时候还需要打开eclipse然后去选择运行文件吗&#xff…

MySQL篇---第十篇

系列文章目录 文章目录 系列文章目录一、说说悲观锁和乐观锁二、怎样尽量避免死锁的出现?三、使用 MySQL 的索引应该注意些什么?一、说说悲观锁和乐观锁 悲观锁 说的是数据库被外界(包括本系统当前的其他事物以及来自外部系统的事务处理)修改保持着保守 态度,因此在整个数…

230 - Borrowers (UVA)

题目链接如下&#xff1a; Online Judge 代码如下&#xff1a; #include <iostream> #include <string> #include <algorithm> #include <vector> #include <map> // #define debugstruct book{std::string title;std::string author;bool is…

一条 SQL 是如何在 MyBatis 中执行的

前言 MyBatis 执行 SQL 的核心接口为 SqlSession 接口&#xff0c;该接口提供了一些 CURD 及控制事务的方法&#xff0c;另外还可以通过 SqlSession 先获取 Mapper 接口的实例&#xff0c;然后通过 Mapper 接口执行 SQL&#xff0c;Mapper 接口方法的执行最终还是委托到 SqlSe…

Linux学习第25天:Linux 阻塞和非阻塞 IO 实验(二): 挂起

Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 为方便和上一节的衔接&#xff0c;在正式开始学习前&#xff0c;先把本节的思维导图引入&#xff1a; 二、阻塞IO实验 1.硬件原理图分析 2.实验程序 #define I…

数字时代新趋势:TikTok算法与海外网红营销的融合策略

在当今数字化时代&#xff0c;社交媒体已经成为品牌推广和市场营销的重要渠道。TikTok作为全球范围内最受欢迎的短视频平台之一&#xff0c;以其独特的算法和用户参与度&#xff0c;正日益成为海外网红营销的热门选择。本文Nox聚星将和大家探讨TikTok算法和海外网红营销之间的融…

全平台七合一万能DIY小程序源码系统 带完整搭建教程

近年来互联网技术的飞速发展&#xff0c;尤其是移动互联网的普及。随着微信、支付宝、百度、抖音、头条等平台的迅速崛起&#xff0c;小程序成为了这些平台上重要的应用形态。这些小程序的应用范围广泛&#xff0c;包括电商、教育、娱乐、生活服务等各个领域。然而&#xff0c;…

【二叉树经典题目】

根据二叉树创建字符串 本题的关键在于什么情况要省略括号&#xff0c;什么情况不能省略&#xff1a; 左右为空可以省略括号 左不为空&#xff0c;右为空可以省略括号左为空,右不为空不能省略括号 class Solution { public://1.左右为空可以省略括号//2.左不为空&#xff0c;右…

基于SSM的高校疫情防控出入信息管理系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

提高微星笔记本Linux下散热性能,MSI-EC 驱动新补丁发布

导读近日消息&#xff0c;今年早些时候&#xff0c;Linux 6.4 中添加了 MSI-EC 驱动程序&#xff0c;允许对 Linux 系统微星笔记本电脑进行更多控制。 MSI-EC 驱动程序近日迎来新补丁&#xff0c;为微星笔记本带来 Cooler Boost 功能。该功能允许提高笔记本电脑的风扇转速&…

Uniapp中嵌入H5( uniapp开发的H5),并且在H5中跳转到APP的指定页面

原生H5跳转uniapp开发的app方式&#xff1a; 1.在APP中使用web-view嵌入H5页面使用web-view组件实现 <template><view><web-view src"https://uniapp.dcloud.net.cn/component/web-view.html"></web-view></view> </template>…

从云到AI到大模型,阿里云始终和谁站在了一起?

引言&#xff1a;云的创新没有减缓 而且在加速深入百行百业 【科技明说 &#xff5c; 热点关注】 【全球云观察 | 每日看点】作为中国最大的云计算厂商&#xff0c;阿里云的产品矩阵覆盖越来越全面&#xff0c;越来越细致&#xff0c;越来越到位。 ​ 在2023杭州云栖大会现场…

java项目之医院病历管理系统(ssm框架)

项目简介 医院病历管理系统实现了以下功能&#xff1a; 管理员&#xff1a;个人中心、医院公告管理、用户管理、科室信息管理、医生管理、出诊信息管理、预约时间段管理、预约挂号管理、门诊病历管理、就诊评价管理、系统管理。医生&#xff1a;个人中心、出诊信息管理、预约…

File --JAVA

File --JAVA 构造方法 方法说明public File (String pathname)根据文件路径创建对象public File (String parent, String child)根据父路径名字字符串和子路径名字符串创建文件对象public File (String parent, String child)根据父路径对应文件对象和子路径名字符串创建文件…

企业计算机电脑中了locked勒索病毒怎么办,勒索病毒解密,数据恢复

网络技术的不断发展&#xff0c;为我们的企业带来了很大的便利&#xff0c;大部分企业都会选择合适的办公软件系统&#xff0c;方便自身的生产与运营。近期&#xff0c;网络上的locked勒索病毒又开始攻击企业的计算机服务器了&#xff0c;经过10月份云天数据恢复中心对企业数据…