组合数(卢卡斯定理)
组合数
从n个不同元素中,任取m(m≤n)个元素并成一组,叫做从n个不同元素中取出m个元素的一个组合;从n个不同元素中取出m(m≤n)个元素的所有组合的个数,叫做从n个不同元素中取出m个元素的组合数。
公 式:C(n,m)=n!/((n-m)!*m!)(m≤n)
性质1:C(n,m)= C(n,n-m)
性质2:C(n,m)=C(n-1,m-1)+C(n-1,m)
定义
组合是数学的重要概念之一。从 n 个不同元素中每次取出 m 个不同元素
,不管其顺序合成一组,称为从 n 个元素中不重复地选取 m 个元素的一个组合。所有这样的组合的种数称为组合数。
性质
1.互补性质
即从m个不同元素中取出n个元素的组合数=从m个不同元素中取出 (m-n) 个元素的组合数;
例如C(9,2)=C(9,7),即从9个元素里选择2个元素的方法与从9个元素里选择7个元素的方法是相等的。
规定:C(n,0)=1
2.组合恒等式
若表示在 n 个物品中选取 m 个物品,则如存在下述公式:C(n,m)=C(n,n-m)=C(n-1,m-1)+C(n-1,m)。
问题
用递归法计算从n个人中选择k个人组成一个委员会的不同组合数。
由n个人里选k个人的组合数 = 由n-1个人里选k个人的组合数 + n-1个人里选k-1个人的组合数
从n-1个人增加到n个人,最后一个人可能被选中也可能不被选中,有两种情况:
1.不被选中,即需要从n-1个人中选择k个人。
2.被选中,即需要从n-1个人中选择k-1个人。
这两种情况加起来就是从n个人里选择k个人的组合数。
#include <iostream>
using namespace std;
// 计算从n个人里选k个人的组合数
int comm(int n, int k)
{if(k > n)return 0;else if(n == k || k == 0)return 1;elsereturn comm(n-1, k) + comm(n-1, k-1);
}int main()
{int n,k;cout<<"Please enter two integers n and k: ";cin>>n>>k;cout<<"C(n, k)="<<comm(n, k)<<endl;return 0;
}
卢卡斯定理(Lacus)求大组合数
现在来了新问题,如果n和m很大呢,
比如求C(n, m) % p , n<=1e18,m<=1e18,p<=1e5
看到没有,n和m这么大,但是p却很小,我们要利用这个p
卢卡斯说要有
C(n, m) % p = C(n / p, m / p) * C(n%p, m%p) % p
于是便有了大组合数有解。
找了一个大佬的理解过程:
贴个模板:
const int p=1e9+7;
ll qmi(ll a,ll k)//用到快速幂/逆元/组合公式
{ll res=1;while(k){if(k&1)res=res*a%p;a=a*a%p;k>>=1;}return res;
}
ll C(int a,int b)
{ll res=1;for(ll i=1,j=a;i<=b;i++,j--){res=res*j%p;res=res*qmi(i,p-2)%p;}return res;
}
ll lucas(ll a,ll b)
{if(a<p&&b<p)return C(a,b);returnC(a%p,b%p)*lucas(a/p,b/p)%p;
}
二
const int p=998244353;
const int N=20000005;
typedef long long ll;
ll qmi(ll a,ll k,ll p)
{ll res=1;while(k){if(k&1)res=res*a%p;a=a*a%p;k>>=1;}return res;
}
ll fac[N];
void init()
{fac[0]=1;for(int i=1;i<=N-10;++i)fac[i]=fac[i-1]*i%p;
}
ll C(ll n,ll m)
{return fac[n]*qmi(fac[n-m]*fac[m]%p,p-2,p)%p;
}
组合数(卢卡斯定理)相关推荐
- 『数学』--数论--组合数+卢卡斯定理+扩展卢卡斯定理
组合数: 在N个数中选取M个数,问选的方式有几种? 直接递归暴力简单 #include<cstdio> const int N = 2000 + 5; const int MOD = (i ...
- 组合数学 —— 组合数取模 —— 卢卡斯定理与扩展卢卡斯定理
[卢卡斯定理] 1.要求:p 是质数,m.n 很大但 p 很小 或者 n.m 不大但大于 p 2.定理内容 其中, 3.推论 当将 n 写成 p 进制:,将 m 写成 p 进制: 时,有: 4.实现 ...
- 组合数求解与(扩展)卢卡斯定理
前言: 咳咳咳咳 ,最近瘟疫盛行,围观的记得要戴口罩. 求解组合数的方法大家应该都见了很多了,这篇博客将围绕这个问题进行归纳和深入学习. 问题: 给定 n , k , p n,k,p n,k,p求解组 ...
- 洛谷——P3807 【模板】卢卡斯定理
P3807 [模板]卢卡斯定理 洛谷智推模板题,qwq,还是太弱啦,组合数基础模板题还没做过... 给定n,m,p($1\le n,m,p\le 10^5$) 求 $C_{n+m}^{m}\ mod\ ...
- 卢卡斯定理及其卢卡斯定理的拓展
前言: 求一个组合数 ,我们可以通过逆元的方式在 O(n)的时间复杂度内求出 但如果数特别大时(数据范围 ),又该怎么办 使用卢卡斯定理求解 卢卡斯定理:(组合数取模,取模的模数只能是质数) 即 模 ...
- 【启智树NOIP模拟】奇偶【卢卡斯定理】【背包】【bitset】
题意:给定 nnn 个数 aia_iai ,求选出(可以重复,考虑顺序)MMM 个数和为 SSS 的方案数模 222. n≤200,ai≤105,M,S≤1018n\leq 200,a_i\leq ...
- BZOJ4591 SHOI2015超能粒子炮·改(卢卡斯定理+数位dp)
注意到模数很小,容易想到使用卢卡斯定理,即变成一个2333进制数各位组合数的乘积.对于k的限制容易想到数位dp.可以预处理一发2333以内的组合数及组合数前缀和,然后设f[i][0/1]为前i位是否卡 ...
- 洛谷 P3807 【模板】卢卡斯定理
题目背景 这是一道模板题. 题目描述 给定n,m,p(1\le n,m,p\le 10^51≤n,m,p≤105) 求 C_{n+m}^{m}\ mod\ pCn+mm mod p 保证P为prim ...
- 洛谷 P4720 【模板】扩展卢卡斯定理/exLucas
[模板]扩展卢卡斯定理/exLucas 题目背景 这是一道模板题. 题目描述 求 Cnmmodp{\mathrm{C}}_n^m \bmod{p}Cnmmodp 其中 C\mathrm{C}C 为组 ...
- 《夜深人静写算法》数论篇 - (22) 卢卡斯定理
文章目录 前言 一.问题引入 1.递推公式 2.通项公式 二.卢卡斯定理 1.定义 2.证明 1)引理1 2)引理2 3)卢卡斯定理 前言 卢卡斯定理,ACM刷题中遇到过,用于组合数取模. 一 ...
最新文章
- Pytorch使用CPU运行“Torch not compiled with CUDA enabled”
- 计算机组成原理整数乘法,计算机组成原理 - 定点整数的原码补码运算(待验证)...
- 信号公式汇总之傅里叶变换
- python文件打包成exe是 upx不可用、找不到py文件_使用PyInstaller将Python程序打包成一个单独的exe文件...
- Qt Creator管理会议
- 将redis加入到elk日志系统里
- 强化学习能挑战众多世界冠军,人类亦能利用强化学习成为冠军
- VC调用QT的UIDLL
- 人工智能/数据科学比赛汇总 2019.5
- 个人笔记上传 -- redis安装
- linux十大实用工具,10大好用的Linux实用工具推荐
- IOS开发之——数据库-Couchbase(05)
- Web前端工程师 VS 前端工程师?What?
- 约瑟夫问题c语言链表41人,约瑟夫问题 C语言链表实现
- 计算机445 135 139端口,Win7如何关闭445 135 138 139端口
- 基于Matlab的随机森林算法实现(附算法介绍及代码详解)
- 《爱上单片机》读后感——5年后终于了解什么是单片机
- 借助Excel批量重命名图片、文档,以及处理文件名中的空格问题(适合新手小白)
- Python学习之CSDN21天学习挑战赛计划之2
- Android帧动画框架
热门文章
- PDF内容太多分不清?这个PDF加页码的方法可以帮助你
- vue获取token 实现token登录
- d06调试详细说明_D06调试软件说明
- 饿了么api接口 php,饿了么接口:php
- 将C盘里的Users文件夹移动到D盘
- Apache ShenYu网关初体验
- 【论文泛读】Don‘t Stop Pretraining: Adapt Language Models to Domains and Tasks
- 面试相关-转载-well,yzl——持续更新
- 个人信贷不良资产成因和策略
- This relative module was not found: Error: Can‘t resolve ‘../assets/bg.jpg‘