Lucas定理是用来求 c(n,m) mod p,p为素数的值。

对于C(n, m) mod p。这里的n,m,p(p为素数)都很大的情况。就不能再用C(n, m) = C(n - 1,m) + C(n - 1, m - 1)的公式递推了。

应用:大组合数求模

表达式

C(n,m)%p=C(n/p,m/p)*C(n%p,m%p)%p
求C(n, m) mod 10007
/*int Lucas (ll n , ll m , int p)
{return m == 0 ? 1 : 1ll*comb (n%p , m%p , p) * Lucas (n/p,m/p,p)%p ;
}*/
//comb()函数中,因为q , r < p , 所以这部分暴力完成即可。
//C++求C(n, m) mod 10007    版本二 要求p z在100000左右
ll f[N];
void init(int p)
{       //f[n] = n!f[0] = 1;for (int i=1; i<=p; ++i) f[i] = f[i-1] * i % p;
}
ll pow_mod(ll a, ll x, int p)
{ll ret = 1;while (x){if (x & 1)  ret = ret * a % p;a = a * a % p;x >>= 1;}return ret;
}ll Lucas(ll n, ll k, int p)        //C (n, k) % p
{ll ret = 1;while (n && k) {ll nn = n % p, kk = k % p;if (nn < kk) return 0;  //inv (f[kk]) = f[kk] ^ (p - 2) % pret = ret * f[nn] * pow_mod (f[kk] * f[nn-kk] % p, p - 2, p) % p;n /= p, k /= p;}return ret;
}
int main(void)
{init (p);printf ("%I64d\n", Lucas (n, m, p));return 0;
}

也可以采用下面的方法,先把mod的阶乘存起来:

void init(int mod){                         //对mod取余后,一定小于mod,因此把mod的阶乘存起来就够用f[0] = 1;for(int i = 1 ; i <= mod ;i ++ ){f[i] = f[i-1] * i % mod;}
}void ex_gcd(LL a,LL b,LL& d,LL& x,LL& y)
{if(!b) { d = a; x = 1; y = 0; }else{ ex_gcd(b, a%b, d, y, x); y -= x*(a/b); }
}LL inv(LL a,LL m)               //欧几里得逆元,也可以费马小定理
{LL d, x, y;ex_gcd(a, m, d, x, y);return d == 1 ? (x+m)%m : -1;
}LL Lucas(LL m , LL n , LL p){LL  res = 1;while(n && m){LL n1 = n % p ;LL m1 = m % p ;res = res * f[n1] * inv(f[n1-m1],p) * inv(f[m1],p)%p;n /= p;m /= p;}return ( res % p + p ) % p;
}

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

  1. 『数学』--数论--组合数+卢卡斯定理+扩展卢卡斯定理

    组合数: 在N个数中选取M个数,问选的方式有几种? 直接递归暴力简单 #include<cstdio> const int N = 2000 + 5; const int MOD = (i ...

  2. 教你一波Lucas(卢卡斯)定理在数论解题中的应用

    首先,Lucas(卢卡斯)定理是什么?有什么用? Lucas定理是用来求 C(n,m) mod p,p为素数的值.(注意:p一定是素数) 有人会想,C(n,m)不能用C(n, m) = C(n - 1 ...

  3. 卢卡斯定理扩展卢卡斯

    卢卡斯定理&扩展卢卡斯 Lucas EXlucas 例题 Lucas 卢卡斯定理: ( m n ) = ( m p n p ) ∗ ( m ( m o d p ) n ( m o d p ) ...

  4. 数论-卢卡斯定理(lucas)与拓展卢卡斯定理 (exlucas)

    卢卡斯定理(lucas) [用途] 求解 C n m % p C_{n}^{m}\% p Cnm​%p,其中m,n较大,p较小且为素数 [结论] C n m ≡ C n / p m / p C n % ...

  5. 数学--数论--HDU 4675 GCD of Sequence(莫比乌斯反演+卢卡斯定理求组合数+乘法逆元+快速幂取模)

    先放知识点: 莫比乌斯反演 卢卡斯定理求组合数 乘法逆元 快速幂取模 GCD of Sequence Alice is playing a game with Bob. Alice shows N i ...

  6. 【数论:组合数学】卢卡斯定理

    知识点 卢卡斯定理转换下来就一个公式: 模板题 洛谷 P3807 [模板]卢卡斯定理/Lucas 定理 题目描述 给定整数 n, m, p 的值,求出 的值. 输入数据保证 p 为质数. 注: C 表 ...

  7. 卢卡斯定理(Lucas)

    卢卡斯定理(Lucas) 证明如下: 结论: ​ 卢卡斯定理的时间复杂度是plogN 代码如下: #include<iostream> using namespace std;int n; ...

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

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

  9. 《夜深人静写算法》数论篇 - (22) 卢卡斯定理

    文章目录 前言 一.问题引入 1.递推公式 2.通项公式 二.卢卡斯定理 1.定义 2.证明 1)引理1 2)引理2 3)卢卡斯定理 前言     卢卡斯定理,ACM刷题中遇到过,用于组合数取模. 一 ...

  10. OI模板 卢卡斯定理

    卢卡斯定理 / Lucas\text{Lucas}Lucas定理 现有问题: 给定整数 n,m,pn,m,pn,m,p,求 (nm)modp\dbinom{n}{m}\bmod p(mn​)modp, ...

最新文章

  1. 7安装ik分词器_Solr7全文检索+IK分词
  2. 中断描述符表IDT以及Linux内核IDT表的初始化的基本情况
  3. Linux实现后台运行程序及查看nohup jobs
  4. ASP.NET Core 基础知识(十四)错误处理
  5. go get如何删除_Go 每日一库之 xorm
  6. Java字符编码介绍
  7. 飞秋(FeiQ)已在计算机技术的世界里沉浸了十年
  8. 前端取消置顶功能_短说开发日报:首页推荐频道刷新后首页置顶的数据没有加载出来的问题已修复(9.22周二)...
  9. PHP+jQuery+MySql实现红蓝投票功能
  10. Ubuntu英语环境下完全显示文泉驿微米黑字体的字体配置文件
  11. html设置带边框九宫格,CSS九宫格带边框的多种实现
  12. oracle怎么截取long类型,如何把long类型的值取出来
  13. 中国医科大学2021年9月《社区护理学》作业考核试题
  14. SpringBoot在thymeleaf模板引擎下集成layDate日期插件
  15. 高性价比掌机Retroid Pocket 3:搭载展锐芯片T310,采用PowerVR GPU
  16. Python实现问卷星调查问卷自动填写
  17. 帧服务器支持会声会影哪个版本,会声会影哪个版本好用
  18. 《黑头人》(暂定)开发日志
  19. android沉浸状态栏和顶部状态栏背景色的设置
  20. LeetCode刷题 876链表的中间结点

热门文章

  1. A - ASCII码排序
  2. 关于人工智能不会使大脑变懒惰的议论文_人工智能的好处和风险:所有您需要知道的...
  3. 上海到底是一座什么样的城市?
  4. python 设置excel单元格式,Python xlwt设置excel单元格字体及格式
  5. Mongoose使用操作
  6. 记一次阿里云k8s部署-测试存储
  7. 简述:静态工作点(Q点),直流负载线,交流负载线
  8. 嵌入式软件工程师—成长笔记#01
  9. 微信小程序车牌号组件,车牌号键盘,兼容新能源号牌
  10. Java 求最大公约数