luogu3807 【模板】 卢卡斯定理
题目大意
对于一个很大的$n,m,p$如何求$C_{n+m}^m\mod p$?
Lucas定理
若$n_i,m_i$分别是$n,m$在$p$进制下第$i$位的数字,则有
$$C_n^m\mod p=\prod_{i=0}^{\log_p m}C_{n_i}^{m_i}\mod p$$
求法
按照定理式一个一个求组合数即可。
组合数并不用批量求。故预处理出各项阶乘值,然后运用
$$C_n^m=\frac{n!}{m!(n-m)!}$$
,因为取模P,运用乘法逆元、快速乘工具求解即可。
注意事项
- MAX_N应当为n,m的范围*2,因为n+m。
- 求组合数时,若m>n,返回0。
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std; #define ll long long
#define inv(a) Inv(a, P)
#define mult(a, b) Mult(a, b, P) const int MAX_N = 200010;
ll Fact[MAX_N];
ll P; void GetFact(int n, ll* Fact, ll p)
{
Fact[0] = 1;
for (int i = 1; i <= n; i++)
Fact[i] = Fact[i - 1] % p * i % p;
} ll Exgcd(ll a, ll b, ll& x, ll& y)
{
if (b == 0)
{
x = 1;
y = 0;
return a;
}
ll d = Exgcd(b, a%b, x, y);
ll tx = x;
x = y;
y = tx - a / b * y;
return d;
} ll Inv(ll a, ll p)
{
ll x, y;
Exgcd(a, p, x, y);
return (x % p + p) % p;
} ll Mult(ll a, ll b, ll p)
{
ll ans = 0;
while (b)
{
if (1 & b)
ans = (ans + a) % p;
a = (a + a) % p;
b >>= 1;
}
return ans;
} ll Comb(ll n, ll m)
{
if (m > n)
return 0;
return mult(Fact[n], inv(mult(Fact[m], Fact[n - m])));
} ll Lucas(ll n, ll m, ll p)
{
if (m == 0)
return 1;
return Comb(n % p, m % p) * Lucas(n / p, m / p, p) % p;
} int main()
{
int caseCnt;
scanf("%d", &caseCnt);
while (caseCnt--)
{
ll n, m;
scanf("%lld%lld%lld", &n, &m, &P);
GetFact(n + m, Fact, P);
printf("%lld\n", Lucas(n + m, m, P));
}
return 0;
}
luogu3807 【模板】 卢卡斯定理的更多相关文章
- 【洛谷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])* ...
- 887. 求组合数 III(模板 卢卡斯定理)
a,b都非常大,但是p较小 前边两种方法都会超时的 N^2 和NlongN 可以用卢卡斯定理 P*longN*longP 定义: 代码: import java.util.Scanner ...
- 洛谷.3807.[模板]卢卡斯定理(Lucas)
题目链接 Lucas定理 日常水题...sublime和C++字体死活不同步怎么办... //想错int范围了...不要被longlong坑 //这个范围现算阶乘比预处理快得多 #include &l ...
- 【Luogu3807】【模板】卢卡斯定理(数论)
题目描述 给定\(n,m,p(1≤n,m,p≤10^5)\) 求 \(C_{n+m}^m mod p\) 保证\(P\)为\(prime\) \(C\)表示组合数. 一个测试点内包含多组数据. 输入输 ...
- 【数论】卢卡斯定理模板 洛谷P3807
[数论]卢卡斯定理模板 洛谷P3807 >>>>题目 [题目] https://www.luogu.org/problemnew/show/P3807 [输入格式] 第一行一个 ...
- P3807 【模板】卢卡斯定理
P3807 [模板]卢卡斯定理 求 \(C_{m + n}^{m} \% p\) ( \(1\le n,m,p\le 10^5\) ) 错误日志: 数组开小(哇啊啊啊洼地hi阿偶我姑父阿贺佛奥UFO爱 ...
- 【刷题】洛谷 P3807 【模板】卢卡斯定理
题目背景 这是一道模板题. 题目描述 给定\(n,m,p( 1\le n,m,p\le 10^5)\) 求 \(C_{n+m}^{m}\ mod\ p\) 保证 \(p\) 为prime \(C\) ...
- 洛谷 P3807 【模板】卢卡斯定理
P3807 [模板]卢卡斯定理 题目背景 这是一道模板题. 题目描述 给定n,m,p(1\le n,m,p\le 10^51≤n,m,p≤105) 求 C_{n+m}^{m}\ mod\ pCn+mm ...
- 洛谷——P3807 【模板】卢卡斯定理
P3807 [模板]卢卡斯定理 洛谷智推模板题,qwq,还是太弱啦,组合数基础模板题还没做过... 给定n,m,p($1\le n,m,p\le 10^5$) 求 $C_{n+m}^{m}\ mod\ ...
- 【luogu P3807】【模板】卢卡斯定理/Lucas 定理(含 Lucas 定理证明)
[模板]卢卡斯定理/Lucas 定理 题目链接:luogu P3807 题目大意 求 C(n,n+m)%p 的值. p 保证是质数. 思路 Lucas 定理内容 对于非负整数 \(n\),\(m\), ...
随机推荐
- A - Supermarket
Problem description We often go to supermarkets to buy some fruits or vegetables, and on the tag the ...
- nodejs 中使用 mysql 实现 crud
首先要使用 mysql 就必须要安装 npm install mysql 然后封装 sql 函数 const mySql = require('mysql'); let connection ; le ...
- 本地Gradle配置方法,免去长时间的更新同步等待
通常gradle项目在gradle\wrapper\gradle-wrapper.properties中配置在线gradle: distributionBase=GRADLE_USER_HOME di ...
- .Net并行计算支持嵌套事务的方法
问题背景 一年前,我们开始利用.Net 4.0的TPL(Task Parallel Library)并行计算技术对复杂计算的功能节点进行性能优化,这些复杂计算往往会包含大量对数据库的操作.在应用TPL ...
- ANN:DNN结构演进History—LSTM网络
为了保持文章系列的连贯性,参考这个文章: DNN结构演进History-LSTM_NN 对于LSTM的使用:谷歌语音转录背后的神经网络 摘要: LSTM使用一个控制门控制参数是否进行梯度计算,以此避免 ...
- CNN结构:SPP-Net为CNNs添加空间尺度卷积-神经元层
前几个CNN检测的框架要求网络的图像输入为固定长宽,而SPP-Net在CNN结构中添加了一个实现图像金字塔功能的卷积层SPP层,用于在网络中实现多尺度卷积,由此对应多尺度输入,以此应对图像的缩放变换和 ...
- cmd 运行 svn 亲测!!!
如果之前安装了svn客户端,但是一直提示svn停止工作的话就可以用cmd去操作svn更新和提交了:或者可以直接用别的代码IDE(包含svn插件的)去进行svn的操作. 接下来我说说windows如何用 ...
- C# 截取字符串基本
#region --构建字符串处理 string str1 = "123AAA456AAAA789AAAAAAA1011"; string str2 = "1234567 ...
- Linux 之根目录介绍
1. /bin binary二进制 存放系统许多可执行程序文件 执行的相关指令,例如ls pwd whoami,后台的支持文件目录 2. /sbin super binary超级的二进制 存放系统许多 ...
- 触发a标签
var aLink = document.createElement("a"); aLink.download = ''; aLink.href = url; if (docume ...