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\), ... 
随机推荐
- B - Chat room
			Problem description Vasya has recently learned to type and log on to the Internet. He immediately en ... 
- 网络开发之使用Web Service和使用WCF服务
			判断是否有可用网络连接可以通过NetworkInterface类中的GetIsNetworkAvailable来实现: bool networkIsAvailable = networkInterfa ... 
- Android开机图片替换
			Android开机图片替换 Android从启动到进入Launcher一共会展示三张图片,如果只是更换静态图则更换这三张图片即可,要想换成动画那就要另外操作. 首先查找这个文件: /bootab ... 
- 怪异的Ubuntu
			怪异的Ubuntu 简单记录ubuntu上出现并且网上不好找到甚至压根找不到解决方案的疑难杂症. lvextend扩展逻辑卷的容量不能被系统检测到 问题发生在Ubuntu 16.04系统上. 逻辑卷/ ... 
- WinDbg使用
			1.抓dump文件 程序崩溃(crash)的时候, 为了以后能够调试分析问题, 可以使用WinDBG要把当时程序内存空间数据都保存下来,生成的文件称为dump 文件. 步骤: 1) 打开WinDBG并 ... 
- 我的C++笔记(数据的共享与保护)
			*数据的共享与保护: * .作用域: * 作用域是一个标识符在程序正文中有效的区域.C++中标识符的作用域有函数原型作用域.局部作用域(块作用域).类作用域和命名空间作用域. * ().函数原型作用域 ... 
- <转>c++引用与指针的区别(着重理解)
			★ 相同点: 1. 都是地址的概念: 指针指向一块内存,它的内容是所指内存的地址:引用是某块内存的别名. ★ 区别: 1. 指针是一个实体,而引用仅是个别名: 2. 引用使用时无需解引用(*),指 ... 
- BZOJ 4278: [ONTAK2015]Tasowanie 后缀数组 + 贪心 + 细节
			Code: #include <bits/stdc++.h> #define setIO(s) freopen(s".in", "r", stdin ... 
- Day 20 re模块(正则表达式)
			re模块 作用:取文本或者字符串内找你所需要的东西 import re re.findall(参数一,参数二,参数三) #暂时用到前两个,第一个为正则表达式,第二个为字符串,也就是被搜索的文本 ^元字 ... 
- Day 1  初识python
			1.Python简介 Python的历史 1989年圣诞节:Guido von Rossum开始写Python语言的编译器. 1991年2月:第一个Python编译器(同时也是解释器)诞生,它是用C语 ... 
