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\), ...
随机推荐
- 解决安装mysql 提示msvcr100.dill 丢失,的最快方法
我也是在学习mysql的时候遇到的这个问题,很多人也遇到了,于是在百度找解决方案 看到有人论坛中写道,用 360安全卫士,可以修复于是我下载了360安全卫士尝试修复, 在人工解答中搜索dll修复,也修 ...
- Java入门系列之访问修饰符作用范围
前言 之前以为Java和C#中访问修饰符差不多一样,后面才了解到还是有些差异,本节只讲解学习Java中访问修饰符一些需要注意的地方或者从概念上不太好理解我们会通过实际例子来说明,若有错误之处,还请批评 ...
- 【题解】uva1104 chips challenge
原题传送门 题目分析 给定一张n*n的芯片. '.'表示该格子可以放一个零件. 'C'表示该格子已经放了一个零件(不能拆下). '/'表示该格子不能放零件. 要求在芯片的现有基础上,放置尽可能多的零件 ...
- day46 mysql进阶
目录 一.约束条件 1 default默认值 2 unique唯一 2.1 单列唯一 2.2 联合唯一 3 primary key主键 3.1 主键的基本使用 3.2 主键的特性 4 auto_inc ...
- SSTI(模板注入)
SSTI 一. 什么是SSTI 模板引擎(这里特指用于Web开发的模板引擎)是为了使用户界面与业务数据(内容)分离而产生的,它可以生成特定格式的文档,用于网站的模板引擎就会生成一个标准的HTML文档. ...
- python 面试题一:Python语言特性
1 Python的函数参数传递 两个例子 a = 1 def fun(a): a = 2 fun(a) print a # a = [] def fun(a): a.append(1) fun(a) ...
- 数据可视化之powerBI入门(三)财务人员必学,使用Powerquery是一种什么体验?
https://zhuanlan.zhihu.com/p/54700574 财务人员必学,使用Powerquery是一种什么体验? 你和Excel高手的距离只差了一个Power Query!!! 先思 ...
- 06 drf源码剖析之权限
06 drf源码剖析之权限 目录 06 drf源码剖析之权限 1. 权限简述 2. 权限使用 3.源码剖析 4. 总结 1. 权限简述 权限与身份验证和限制一起,决定了是否应授予请求访问权限. 权限检 ...
- python之将一个字符串str的内容倒叙过来,并输出。
inStr = input() flashback = inStr[::-1] print(flashback)
- Nslookup命令的使用 - [详细]
用法一.查询IP地址 nslookup最简单的用法就是查询域名对应的IP地址,包括A记录和CNAME记录,如果查到的是CNAME记录还会返回别名记录的设置情况.其用法是: nslookup 域名 # ...