数论-Lucas(卢卡斯定理)
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)的公式递推了。
应用:大组合数求模
表达式
/*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(卢卡斯定理)相关推荐
- 『数学』--数论--组合数+卢卡斯定理+扩展卢卡斯定理
组合数: 在N个数中选取M个数,问选的方式有几种? 直接递归暴力简单 #include<cstdio> const int N = 2000 + 5; const int MOD = (i ...
- 教你一波Lucas(卢卡斯)定理在数论解题中的应用
首先,Lucas(卢卡斯)定理是什么?有什么用? Lucas定理是用来求 C(n,m) mod p,p为素数的值.(注意:p一定是素数) 有人会想,C(n,m)不能用C(n, m) = C(n - 1 ...
- 卢卡斯定理扩展卢卡斯
卢卡斯定理&扩展卢卡斯 Lucas EXlucas 例题 Lucas 卢卡斯定理: ( m n ) = ( m p n p ) ∗ ( m ( m o d p ) n ( m o d p ) ...
- 数论-卢卡斯定理(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 % ...
- 数学--数论--HDU 4675 GCD of Sequence(莫比乌斯反演+卢卡斯定理求组合数+乘法逆元+快速幂取模)
先放知识点: 莫比乌斯反演 卢卡斯定理求组合数 乘法逆元 快速幂取模 GCD of Sequence Alice is playing a game with Bob. Alice shows N i ...
- 【数论:组合数学】卢卡斯定理
知识点 卢卡斯定理转换下来就一个公式: 模板题 洛谷 P3807 [模板]卢卡斯定理/Lucas 定理 题目描述 给定整数 n, m, p 的值,求出 的值. 输入数据保证 p 为质数. 注: C 表 ...
- 卢卡斯定理(Lucas)
卢卡斯定理(Lucas) 证明如下: 结论: 卢卡斯定理的时间复杂度是plogN 代码如下: #include<iostream> using namespace std;int n; ...
- 【luogu P3807】【模板】卢卡斯定理/Lucas 定理(含 Lucas 定理证明)
[模板]卢卡斯定理/Lucas 定理 题目链接:luogu P3807 题目大意 求 C(n,n+m)%p 的值. p 保证是质数. 思路 Lucas 定理内容 对于非负整数 nnn,mmm,质数 p ...
- 《夜深人静写算法》数论篇 - (22) 卢卡斯定理
文章目录 前言 一.问题引入 1.递推公式 2.通项公式 二.卢卡斯定理 1.定义 2.证明 1)引理1 2)引理2 3)卢卡斯定理 前言 卢卡斯定理,ACM刷题中遇到过,用于组合数取模. 一 ...
- OI模板 卢卡斯定理
卢卡斯定理 / Lucas\text{Lucas}Lucas定理 现有问题: 给定整数 n,m,pn,m,pn,m,p,求 (nm)modp\dbinom{n}{m}\bmod p(mn)modp, ...
最新文章
- 7安装ik分词器_Solr7全文检索+IK分词
- 中断描述符表IDT以及Linux内核IDT表的初始化的基本情况
- Linux实现后台运行程序及查看nohup jobs
- ASP.NET Core 基础知识(十四)错误处理
- go get如何删除_Go 每日一库之 xorm
- Java字符编码介绍
- 飞秋(FeiQ)已在计算机技术的世界里沉浸了十年
- 前端取消置顶功能_短说开发日报:首页推荐频道刷新后首页置顶的数据没有加载出来的问题已修复(9.22周二)...
- PHP+jQuery+MySql实现红蓝投票功能
- Ubuntu英语环境下完全显示文泉驿微米黑字体的字体配置文件
- html设置带边框九宫格,CSS九宫格带边框的多种实现
- oracle怎么截取long类型,如何把long类型的值取出来
- 中国医科大学2021年9月《社区护理学》作业考核试题
- SpringBoot在thymeleaf模板引擎下集成layDate日期插件
- 高性价比掌机Retroid Pocket 3:搭载展锐芯片T310,采用PowerVR GPU
- Python实现问卷星调查问卷自动填写
- 帧服务器支持会声会影哪个版本,会声会影哪个版本好用
- 《黑头人》(暂定)开发日志
- android沉浸状态栏和顶部状态栏背景色的设置
- LeetCode刷题 876链表的中间结点