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. Java面向对象程序设计

    北京电子科技学院(BESTI)                                                                                 实    ...

  2. 《Java学习笔记JDK8》学习总结

    chapter 6   继承与多态 6.1何谓继承 1.继承的定义:继承就是避免多个类间重复定义共同行为. 2.总结:教材中通过设计一款RPG游戏的部分代码向我们展示了“重复”程序代码的弊端,为了改进 ...

  3. AttributeError: module ‘tensorflow.python.ops.nn’ has no attribute ‘leaky_relu’

    #AttributeError: module 'tensorflow.python.ops.nn' has no attribute 'leaky_relu' 的原因主要是版本的问题 解决方法是更新 ...

  4. 2017 Summary

    几门课 基础电路与电子学 知道了一些二极管三极管的基本基本很基本的那种物理知识吧,但是毕竟我是从电信转专业过来的,所以说我内心就是逃避模电这样的课的.上课基本没听,后面只是死命复习了一周,考的还可以. ...

  5. 使用JavascriptExecutor将页面滚动到最底部

    使用如下代码,将页面滚动到最底部 @Test(enabled = true) public void scroll(){ String jsStr="window.scrollTo(0,do ...

  6. gitlab邮箱服务配置

    配置邮箱服务的用途 有合并请求时,邮件通知 账号注册时,邮件验证 修改密码时,通过邮件修改 配置步骤: .开启QQ邮箱的smtp服务(不建议使用163邮箱,发几次之后,就不能发送) 设置-->账 ...

  7. 使用WinSW 将 exe 创建成Windows下面 service的方法 (将nginx创建成 services)

    1. 使用winsw工具能够将部分exe 创建成服务, 这样可以很简单的创建nginx的服务, 避免每次需要执行相应的命令. 2. 方法,下载 工具 地址 github https://github. ...

  8. centos6.7 安装JDK

      1.卸载JDK 查看系统是否已安装JDK.一般的linux都默认使用了开源的openJDK.显示JDK版本信息,已经安装JDK,否则没有安装.命令行: [root@localhost ~]# ja ...

  9. Python之路3【第零篇】目录

    Web应用框架篇 1.Web应用框架前戏

  10. P3758 [TJOI2017]可乐

    题目描述 加里敦星球的人们特别喜欢喝可乐.因而,他们的敌对星球研发出了一个可乐机器人,并且放在了加里敦星球的1号城市上.这个可乐机器人有三种行为: 停在原地,去下一个相邻的城市,自爆.它每一秒都会随机 ...