Lucas(卢卡斯)定理
公式
$$C_n^m\%p=C_{n/p}^{m/p}*C_{n\%p}^{m\%p}\%p~~(p为素数)$$
代码如下
typedef long long ll;
ll mod_pow(ll x, ll n, ll mod)
{
ll res = 1;
while (n > 0)
{
if (n & 1)
res = res * x % mod;
x = x * x % mod;
n >>= 1;
}
return res;
}
ll comb(ll n, ll m, ll p)
{
if (m > n)
return 0;
ll a = 1, b = 1;
m = min(n - m, m);
while(m)
{
a = (a * n--) % p;
b = (b * m--) % p;
}
return a * mod_pow(b, p - 2, p) % p;
}
ll Lucas(ll n, ll m, ll p)
{
if (m == 0)
return 1;
return comb(n % p, m % p, p) * Lucas(n / p, m / p, p) % p;
}
例题
解析:m个相同的豆子,放到n个不同的树里,有多少种方法。有$C_{n+m}^m$种。具体详解请看下面的扩展中的插板法。
代码如下:
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
ll mod_pow(ll x, ll n, ll mod)
{
ll res = 1;
while (n > 0)
{
if (n & 1)
res = res * x % mod;
x = x * x % mod;
n >>= 1;
}
return res;
}
ll comb(ll n, ll m, ll p)
{
if (m > n)
return 0;
ll a = 1, b = 1;
m = min(n - m, m);
while(m)
{
a = (a * n--) % p;
b = (b * m--) % p;
}
return a * mod_pow(b, p - 2, p) % p;
}
ll Lucas(ll n, ll m, ll p)
{
if (m == 0)
return 1;
return comb(n % p, m % p, p) * Lucas(n / p, m / p, p) % p;
}
int main(int argc, char* argv[])
{
ios::sync_with_stdio(false);
cin.tie(0);
ll T, n, m, p;
cin >> T;
while (T--)
{
cin >> n >> m >> p;
cout << Lucas(n + m, m, p) << endl;
}
return 0;
}

扩展
插板法
适用类型
一组相同的元素,分成若干不同的组,每组至少一个元素。
例题1
将8个相同的小球放到3个不同的盒子,每个盒子至少放一个球,一共有多少种方法。
解:8个盒子,有7个空,分到3个盒子,需要插2块板,$C_7^2=21$种。
对于不满足每组至少一个元素条件的,应该先转化为标准形式。
例题2
将8个相同的小球放到3个不同的盒子,每个盒子至少放两个球,一共有多少种方法。
解析:先往每一个盒子里放一个小球。转化为:5个相同的小球放到不同的盒子,每个盒子至少放1个小球,一共有多少种方法。$C_4^2=6$种。
例题3
将8个相同的小球放到3个不同的盒子,有多少种方法。
解析:我们先让每个盒子吐出1个球,使得每个盒子至少一个球,分球的时候再让盒子吃回去。转化为:11个相同的球放到3个不同的盒子中,每个盒子至少一个,有多少种方法。$C_{10}^2=45$种。
例题4
$a+b+c=10$有多少组正整数解。
解析:转化为:10个相同的小球,放到不同的3个盒子中,每个盒子至少一个,有多少方法。$C_9^2=36$种。
例题5
$a+b+c=10$有多少组非负整数解。
解析:转化为:13个相同的小球,放到不同的3个盒子中,有多少方法。$C_{12}^2=66$种。
例题6
$a+b+c\leqslant 10$有多少组非负整数解。
解析1:转化为$a+b+c+d =10$,即10个相同的球,放到4个不同的盒子中,有多少方法。$C_{13}^3=286$种。
解析2:列举所有情况:$a+b+c=0(C_2^2)$,$a+b+c=1(C_3^2)$,$\cdots$,$a+b+c=10(C_{12}^2)$,$\sum\limits_{i=2}^{12}C_i^2=C_{13}^3=286$种。
注:$\sum\limits_{i=m}^nC_i^m=C_{n+1}^{m+1}$。
杨辉三角性质之一:斜线上数字的和等于其向左(从左上方到右下方的斜线)或向右拐弯(从右上方到左下方的斜线),拐角上的数字。
Lucas(卢卡斯)定理的更多相关文章
- Lucas 卢卡斯定理
Lucas: 卢卡斯定理说白了只有一条性质 $$ C^n_m \equiv C^{n/p}_{m/p} \times C^{n \bmod p}_{m \bmod p} \ (mod \ \ p) $ ...
- CRT中国剩余定理 & Lucas卢卡斯定理
数论_CRT(中国剩余定理)& Lucas (卢卡斯定理) 前言 又是一脸懵逼的一天. 正文 按照道理来说,我们应该先做一个介绍. 中国剩余定理 中国剩余定理,Chinese Remainde ...
- Lucas(卢卡斯)定理模板&&例题解析([SHOI2015]超能粒子炮·改)
Lucas定理 先上结论: 当p为素数: \(\binom{ N }{M} \equiv \binom{ N/p }{M/p}*\binom{ N mod p }{M mod p} (mod p)\) ...
- Lucas卢卡斯定理
当$p$为素数时 $$C_n^m\equiv C_{n/p}^{m/p}*C_{n\%p}^{m\%p}(mod\ p)$$ 设$n=s*p+q,m\equiv t*p+r(q,r<=p)$ 我 ...
- 卢卡斯定理 Lucas (p为素数)
证明摘自:(我网上唯一看得懂的证明) https://blog.csdn.net/alan_cty/article/details/54318369 结论:(显然递归实现)lucas(n,m)=luc ...
- 卢卡斯定理Lucas
卢卡斯定理Lucas 在数论中,\(Lucas\)定理用于快速计算\(C^m_n ~ \% ~p\),即证明\(C^m_n = \prod_{i = 0} ^kC^{m_i}_{n_i}\)其中\(m ...
- 数论篇7——组合数 & 卢卡斯定理(Lucas)
组合数 组合数就是高中排列组合的知识,求解组合数C(n,m),即从n个相同物品中取出m个的方案数. 求解方式 求解通式:$C^{m}_{n}=\dfrac {n!}{m!\left( n-m\righ ...
- Lucas(卢卡斯)定理
Lucas定理 对于C(m,n)%P(P是质数)这样的问题,可以通过预处理阶乘和阶乘的逆元,来快速计算.但是当m,n大于P时,就不能保证m,n与P互质了,但不互质的情况下,乘法逆元不存在,此时就需要卢 ...
- 【luogu P3807】【模板】卢卡斯定理/Lucas 定理(含 Lucas 定理证明)
[模板]卢卡斯定理/Lucas 定理 题目链接:luogu P3807 题目大意 求 C(n,n+m)%p 的值. p 保证是质数. 思路 Lucas 定理内容 对于非负整数 \(n\),\(m\), ...
随机推荐
- PE文件格式详解(二)
0x00 前言 上一篇讲到了PE文件头的中IMAGE_FILE_HEADER结构的第二个结构,今天从IMAGE_FILE_HEADER中第三个结构sizeOfOptionalHeader讲起.这个字段 ...
- [设计模式]工厂方法模式(Factory Method)
模式目的 定义一个用于创建对象的接口,让其子类来决定实例化哪个类. 工厂方法模式将类的实例化延迟到了子类中进行. 模式结构 组成部分 产品(Product) - 定义了产品功能的接口 具体产品(Con ...
- 使用eval将字符串转化成字典时报name 'null' is not defined错误解决办法
在接口测试过程中,为了取值将形如字典形式的字符串使用eval()方法转化成字典方便取值 str={"code":100,"num":1,"data&q ...
- spring security简单登录的认证
一.思路 1.先导入相关配置(使用spring security校验之后,登录拦截的配置) 2.创建一个 WebSecurityConfig 继承 WebSecurityConfigurerAdapt ...
- Ethical Hacking - Web Penetration Testing(9)
SQL INJECTION Discovering SQLi in GET Inject by browser URL. Selecting Data From Database Change the ...
- Burp Suite Compare Module - 对比模块
虚拟目标网站: http://10.0.0.15/orangehrm/login.php (RangeHRM) - 可以通过OWASP虚拟机搭建此网站 模拟攻击步骤: 1. 通过设置浏览器代理 ...
- ref和动态组件
ref--------指引 另一种获取表单值的方法 是Vue环境中一个内置的属性.它可以使用this.$refs可以快速拿到DOM对象.
- spring boot 整合 ehcache
1. 该说的话 每个人都应当学会独立地去思考.去寻找答案,而不是一味地伸手向他人索取所谓的标准答案. 首先,别成为"拿来主义"者,其次远离"拿来主义"的人. 2 ...
- commvalut oracle backup command
run { allocate channel ch1 type 'sbt_tape'PARMS="SBT_LIBRARY=<software_installation_path> ...
- lambda之美
github源码 大前提:jdk8 允许lambda表达式 最好在maven中加入 <properties> <java.version>1.8</java.vers ...