P3807 【模板】卢卡斯定理

求 \(C_{m + n}^{m} \% p\) ( \(1\le n,m,p\le 10^5\) )


错误日志: 数组开小(哇啊啊啊洼地hi阿偶我姑父阿贺佛奥UFO爱我帮你)


Pre

好的我们继续恶补数学

首先复习一下 \(O(N)\) 求质数逆元的方法$$inv[1] = 1$$$$inv[i] = (p - p / i) * inv[p % i] % p (i >= 2)$$

LL inv[maxn];
void get_inv(LL n){
inv[1] = 1;
for(LL i = 2;i <= n;i++)inv[i] = (p - p / i) * inv[p % i] % p;
}

然后是 \(O(m)\) 求 \(C_{n}^{m} \% p\):$$C_{n}^{m}% p = \frac{n!}{m!(n - m)!}% p$$$$=\frac{(n - m + 1) * (n - m +2) * ... * n}{m!}% p$$$$=(\frac{n - m + 1}{1}% p) * (\frac{n - m + 2}{2}% p) * ... * (\frac{n}{m}% p)$$

其中除法取模可以用上面的逆元计算, 求解一个组合数的复杂度为 \(O(m)\)

LL C(LL n, LL m){
LL ans = 1;
for(LL i = 1;i <= m;i++)ans = ans * (n - m + i) * inv[i] % p;
return ans;
}

最后就是卢卡斯定理, 当 \(p\) 为质数时有:$$C_{n}^{m} % p = C_{n % p}^{m % p} * C_{n / p}^{m / p} % p$$

其中取模过了的部分可以很快的计算出来, 另一部分继续递归卢卡斯即可

LL lucas(LL n, LL m, LL p){
if(m == 0)return 1;
return C(n % p, m % p) * lucas(n / p, m / p, p) % p;
}

Solution

于是乎掌握了上边的知识后就变成裸题啦

Code

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
#include<climits>
#define LL long long
using namespace std;
LL RD(){
LL out = 0,flag = 1;char c = getchar();
while(c < '0' || c >'9'){if(c == '-')flag = -1;c = getchar();}
while(c >= '0' && c <= '9'){out = out * 10 + c - '0';c = getchar();}
return flag * out;
}
const LL maxn = 200019;
LL n, m, p;
LL inv[maxn];
void get_inv(LL n){
inv[1] = 1;
for(LL i = 2;i <= n;i++)inv[i] = (p - p / i) * inv[p % i] % p;
}
LL C(LL n, LL m){
LL ans = 1;
for(LL i = 1;i <= m;i++)ans = ans * (n - m + i) * inv[i] % p;
return ans;
}
LL lucas(LL n, LL m, LL p){
if(m == 0)return 1;
return C(n % p, m % p) * lucas(n / p, m / p, p) % p;
}
int main(){
LL T = RD();
while(T--){
n = RD(), m = RD(), p = RD();
get_inv(m);
printf("%lld\n", lucas(n + m, m, p));
}
return 0;
}

P3807 【模板】卢卡斯定理的更多相关文章

  1. 【洛谷P3807】(模板)卢卡斯定理

    卢卡斯定理 把n写成p进制a[n]a[n-1][n-2]…a[0],把m写成p进制b[n]b[n-1][n-2]…b[0],则C(n,m)与C(a[n],b[n])*C(a[n-1],b[n-1])* ...

  2. 887. 求组合数 III(模板 卢卡斯定理)

    a,b都非常大,但是p较小 前边两种方法都会超时的  N^2 和NlongN  可以用卢卡斯定理  P*longN*longP     定义: 代码: import java.util.Scanner ...

  3. 洛谷.3807.[模板]卢卡斯定理(Lucas)

    题目链接 Lucas定理 日常水题...sublime和C++字体死活不同步怎么办... //想错int范围了...不要被longlong坑 //这个范围现算阶乘比预处理快得多 #include &l ...

  4. 【数论】卢卡斯定理模板 洛谷P3807

    [数论]卢卡斯定理模板 洛谷P3807 >>>>题目 [题目] https://www.luogu.org/problemnew/show/P3807 [输入格式] 第一行一个 ...

  5. 洛谷 P3807 【模板】卢卡斯定理

    P3807 [模板]卢卡斯定理 题目背景 这是一道模板题. 题目描述 给定n,m,p(1\le n,m,p\le 10^51≤n,m,p≤105) 求 C_{n+m}^{m}\ mod\ pCn+mm ...

  6. 洛谷——P3807 【模板】卢卡斯定理

    P3807 [模板]卢卡斯定理 洛谷智推模板题,qwq,还是太弱啦,组合数基础模板题还没做过... 给定n,m,p($1\le n,m,p\le 10^5$) 求 $C_{n+m}^{m}\ mod\ ...

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

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

  8. 【刷题】洛谷 P3807 【模板】卢卡斯定理

    题目背景 这是一道模板题. 题目描述 给定\(n,m,p( 1\le n,m,p\le 10^5)\) 求 \(C_{n+m}^{m}\ mod\ p\) 保证 \(p\) 为prime \(C\) ...

  9. P3807【模板】卢卡斯定理

    题解大部分都是递归实现的,给出一种非递归的形式 话说上课老师讲的时候没给代码,然后自己些就写成了这样 对于质数\(p\)给出卢卡斯定理: \[\tbinom{n}{m}=\tbinom{n \bmod ...

随机推荐

  1. 感谢Thunder团队

    不知不觉中,团队开发的beta版本都已经结束.开发的路上我们一起解决了很多难题,相互帮助走到了现在. 首先我想感谢组长王航.认真负责合理分配任务,使得我们每次发布都可以顺利并且按时完成.感谢胡佑蓉,李 ...

  2. 【每日scrum】第一次冲刺day3

    学习安卓,和小伙伴讨论百度API调用的问题,最后决定自己写地图

  3. 《UML大战需求分析》-读后感三

    用例图是用来描述什么角色通过某某系统能做什么的图,用例图关注的是系统的外在表示想爱你.系统与人的交互系统与其他系统的交互,小人执行者就是角色,角色 是对系统使用者的抽象,一个角色可以代表多个具体的人而 ...

  4. bata4

    目录 组员情况 组员1(组长):胡绪佩 组员2:胡青元 组员3:庄卉 组员4:家灿 组员:恺琳 组员6:翟丹丹 组员7:何家伟 组员8:政演 组员9:黄鸿杰 组员10:刘一好 组员11:何宇恒 展示组 ...

  5. python learning OOP2.py

    class Student(object): pass s = Student() s.name = 'Chang' # 给一个实例动态绑定一个属性 print(s.name) def set_age ...

  6. [并查集] 1118. Birds in Forest (25)

    1118. Birds in Forest (25) Some scientists took pictures of thousands of birds in a forest. Assume t ...

  7. SqlHelper类的编写

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.D ...

  8. 消息队列第二篇:MessageQueue实战(课程订单)

    上一篇:消息队列介绍 本篇一开始就上代码,主要演练MessageQueue的实际应用.用户提交订单(消息发送),系统将订单发送到订单队列(Order Queue)中:订单管理系统(消息接收)端,监听消 ...

  9. 学术诚信与职业道德——《构建之法》P384~391读后感

    程序本身没有伦理和职业道德, 但是程序员和软件企业要有,因为程序员明白伦理道德的存在. 对于刚刚经历被不负责队友抛下的经历,对此很有感触,软件工程师除了遵守任务做事,也要考虑道德上.责任上的事情. 就 ...

  10. Scrum 项目 3.0

    -------------------------------------3.0----------------------------------------------------- 一.项目工作 ...