Lucas

  • Lucas定理
  • Lucas板子
  • 组合数计算
  • Saving Beans HDU - 3037

Lucas定理

Cnmmodp=Cn/pm/p×CnmodpmmodpmodpC_n^m \mod p=C_{n/p}^{m/p} \times C_{n\mod p}^{m\mod p} \mod pCnm​modp=Cn/pm/p​×Cnmodpmmodp​modp,p为素数

Lucas板子

int qpow(ll b,int n,int mod)
{int res=1;while(n){if(n&1) res=1ll*res*b%mod;b=1ll*b*b%mod;n>>=1;}return res;
}int fac[maxn];
void init(int p)
{fac[0]=fac[1]=1;for(int i=2;i<=p;++i)fac[i]=1ll*fac[i-1]*i%p;
}int C(int n,int m,int p)
{if(m>n) return 0;return 1ll*fac[n]*qpow(1ll*fac[m]*fac[n-m]%p,p-2,p)%p;
}int Lucas(ll n,ll m,int p)
{int ans=1;while(n&&m&&ans){ans=1ll*ans*C(n%p,m%p,p)%p;n/=p;m/=p;}return ans;
}

组合数计算

取模时,需要注意 n < m 的情况,此时为 0

1、线性推逆元,在只需要初始化一次的时候使用比较好

const int N=5e5;
int fac[N+10],finv[N+10];
void init()
{fac[0]=fac[1]=1;for(int i=2;i<=N;++i)fac[i]=1ll*fac[i-1]*i%mod;finv[N]=qpow(fac[N],mod-2,mod);for(int i=N-1;i>=0;--i)finv[i]=1ll*finv[i+1]*(i+1)%mod;
}int C(int n,int m)
{return 1ll*fac[n]*finv[m]%mod*finv[n-m]%mod;
}

2、推出阶乘之后,用费尔马小定理计算逆元

int fac[maxn];
void init(int p)
{fac[0]=fac[1]=1;for(int i=2;i<=p;++i)fac[i]=1ll*fac[i-1]*i%p;
}int C(int n,int m,int p)
{if(m>n) return 0;return 1ll*fac[n]*qpow(1ll*fac[m]*fac[n-m]%p,p-2,p)%p;
}

3、直接用组合式公式计算

ll C(ll a,ll b,ll p)
{if(a<b) return 0;if(a==b) return 1;if(b>a-b) b=a-b;ll ca=1,cb=1;for(int i=0;i<b;++i){ca=(ca*(a-i))%p;cb=cb*(i+1)%p;}return ca*qpow(cb,p-2,p)%p;
}

4、不需要取模时,用杨辉三角

ll C[1000][1000];
void init()
{C[0][0]=1;for(int i=1;i<=500;++i){C[i][0]=C[i][i]=1;for(int j=1;j<=i-1;++j)C[i][j]=C[i-1][j-1]+C[i-1][j];}
}

Saving Beans HDU - 3037


链接:http://acm.hdu.edu.cn/showproblem.php?pid=3037

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=1e5+5,maxm=1e5+5;int qpow(ll b,int n,int mod)
{int res=1;while(n){if(n&1) res=1ll*res*b%mod;b=1ll*b*b%mod;n>>=1;}return res;
}int fac[maxn];
void init(int p)
{fac[0]=fac[1]=1;for(int i=2;i<=p;++i)fac[i]=1ll*fac[i-1]*i%p;
}int C(int n,int m,int p)
{if(m>n) return 0;return 1ll*fac[n]*qpow(1ll*fac[m]*fac[n-m]%p,p-2,p)%p;
}int Lucas(ll n,ll m,int p)
{int ans=1;while(n&&m&&ans){ans=1ll*ans*C(n%p,m%p,p)%p;n/=p;m/=p;}return ans;
}
int t,n,m,p;int main()
{scanf("%d",&t);while(t--){scanf("%d%d%d",&n,&m,&p);init(p);printf("%d\n",Lucas(n+m,m,p));}return 0;
}

卢卡斯(Lucas)定理相关推荐

  1. Lucas(卢卡斯)定理

    Lucas定理,是用来快速求解一个组合数对于一个数(保证这一个数是质数)的模. 那么,我们先来看Lucas定理的求解式: \(\binom{n}{m}\%p\)(\(p\)是质数) 这样的一个式子,在 ...

  2. 【luogu P3807】【模板】卢卡斯定理/Lucas 定理(含 Lucas 定理证明)

    [模板]卢卡斯定理/Lucas 定理 题目链接:luogu P3807 题目大意 求 C(n,n+m)%p 的值. p 保证是质数. 思路 Lucas 定理内容 对于非负整数 nnn,mmm,质数 p ...

  3. Lucas(卢卡斯)定理 【数论】

    Lucas定理是用来求 c(n,m) mod p,p为素数的值. 表达式  C(n,m)%p=C(n/p,m/p)*C(n%p,m%p)%p 应用  大组合数求模 typedef long long ...

  4. [学习笔记]扩展LUCAS定理

    可以先做这个题[SDOI2010]古代猪文 此算法和LUCAS定理没有半毛钱关系. [模板]扩展卢卡斯 不保证P是质数. $C_n^m=\frac{n!}{m!(n-m)!}$ 麻烦的是分母. 如果互 ...

  5. Lucas定理扩展Lucas

    Lucas定理 求解 C n m m o d    p C_n^m\mod p Cnm​modp (p为素数) 蒟蒻不会证明,记着递推公式就好=_= L u c a s ( n , m ) = C ( ...

  6. lucas定理、拓展lucas定理学习小结

    lucas定理 正题 首先,这玩意就是下面这个式子: C m n % p = C m / p n / p ∗ C m % p n % p % p C_m^n\%p=C_{m/p}^{n/p}*C_{m ...

  7. Lucas 定理学习笔记

    Lucas 定理 Lucas 定理用于求解大组合数取模的问题,其中模数必须为素数.正常的组合数运算可以通过递推公式求解(详见排列组合),但当问题规模很大,而模数是一个不大的质数的时候,就不能简单地通过 ...

  8. 【排列组合】 组合(lucas定理)

    题目描述 给出组合数 C(n,m) 表示从 n 个元素中选出 m 个元素的方案数.例如 C(5,2)=10,C(4,2)=6.可是当 n,m 比较大的时候,C(n,m) 很大.于是 xiaobo 希望 ...

  9. 数论(Lucas定理) HDOJ 4349 Xiao Ming's Hope

    题目传送门 题意:求C (n,0),C (n,1),C (n,2)...C (n,n)中奇数的个数 分析:Lucas 定理:A.B是非负整数,p是质数.AB写成p进制:A=a[n]a[n-1]...a ...

  10. szucodeforce训练1081C组合数学lucas定理,div2 627的D dfs +剪枝优化,697D Puzzles{dfs序+概率}

    给你n个方格排成一行,有m种颜色,然后要把这n个方格分成k+1段,每段涂不同的颜色,问有多少种方法. 组合数学Lucas定理 排列组合问题,首先要在n-1个位置里面选出k个位置当作段与段的分割点,然后 ...

最新文章

  1. pcntl_fork 导致 MySQL server has gone away 解决方案
  2. 两台电脑可以用同一IP上网吗?
  3. 基于 ida 的反汇编转换 Obj 的可行性 笔记(2)
  4. Rust中mut, , mut的区别
  5. 华为云原生数据仓库GaussDB(DWS)深度技术解读:融、快、大、稳、易
  6. 编写高质量代码的十个秘诀(转)
  7. centos光盘修复引导_CentOS 6.5 修复grub引导
  8. 计算机二级考试基础知识文档,计算机二级公共基础知识(考试必考)
  9. gallery3d 代码分析
  10. 计算机两个基准键用户来定位,键盘与指法基准键位练习
  11. 工程模式写入imei_开发初期IMEI号的写入
  12. 期货反跟单软件介绍与反跟单交易中的骗局
  13. Scanf 用法和注意事项
  14. 百度AI市场热品试用 | 迪威泰超薄双目摄像机模组
  15. Rufus轻松创建USB启动盘
  16. codewars练习(javascript)-2021/3/14
  17. canvas 对图片进行涂抹,涂抹区域保存图片存入本地
  18. android 修改充电图标,更换图标、修改充电音...这个软件把iPhone玩成了安卓
  19. win11自带杀毒软件怎么关闭 windows11关闭自带杀毒软件的步骤
  20. DirectShow编程(3.5) - 关于DirectShow - DirectShow中的事件通告

热门文章

  1. svchost 总是占用网速 一招见效(实测)
  2. key位置 win10生成的ssh_WIN 10生成SSH密钥教程
  3. 阅读笔记:3D visual discomfort predictor based on subjective perceived-constraint sparse representation
  4. 微波射频学习笔记9--------品质因数Q值的意义
  5. android: Apostrophe not preceded by \ 错误
  6. 根据pc值确定出错的代码位置
  7. ibm tivoli_调优IBM DB2以获得最佳的IBM Tivoli Security Operations Manager性能
  8. 关于 IBM Tivoli Storage Manager在Oracle中的应用
  9. 导航中的常用坐标系解析
  10. php zend_extension,extension 和zend_extension 两种扩展