lucas定理 模板
lucas定理
(nm) mod p=(⌊np⌋⌊mp⌋)(n mod pm mod p) mod p=(n/pm/p)(n%pm%p) mod p\tbinom{n}{m} \bmod p = \tbinom{\lfloor \frac{n}{p} \rfloor}{\lfloor \frac{m}{p} \rfloor} \tbinom{n \bmod p}{m \bmod p} \bmod p=\tbinom{n/p}{m/p}\tbinom{n\%p}{m\%p} \bmod p(mn)modp=(⌊pm⌋⌊pn⌋)(mmodpnmodp)modp=(m/pn/p)(m%pn%p)modp
先预先求出i!  (i∈[0,p))i! \;(i \in \left[0,p\right))i!(i∈[0,p)).
并利用费马小定理和快速幂乘求出每一个i!i!i!的逆元(i!)−1(i!)^{-1}(i!)−1。求(nm) mod p\tbinom{n}{m} \bmod p(mn)modp,当m=0m=0m=0直接就是111.若n,mn,mn,m都在ppp范围内,则直接转化为n!×(m!)−1×[(n−m)!]−1n! \times (m!)^{-1} \times [(n-m)!]^{-1}n!×(m!)−1×[(n−m)!]−1.否则就是lucas定理缩小规模。
[对一个固定的p,预处理求阶乘及快速模幂求其逆元,时间复杂度O(plog2p)O(p\log_2{p})O(plog2p)。空间复杂度O(p)O(p)O(p)。预处理之后,单次求(nm) mod p\tbinom{n}{m} \bmod p(mn)modp复杂度O(logpm)O(\log_{p}{m})O(logpm)]{}
洛谷P3807模板题
void prepare(ll p, vector<ll>&fac, vector<ll>&inv_fac) {
fac.resize(p); inv_fac.resize(p);
mod_sys mod;
mod.set_mod(p);
fac[0] = 1;
inv_fac[0] = 1;
for (int i = 1; i < p; ++i) {
fac[i] = (fac[i-1]*i)%p;
inv_fac[i] = mod.pow(fac[i], p-2); // 既然能枚举一遍,p*p不应该爆ll
}
}
// 输入预设0=<n,m<p
inline ll combination(ll n, ll m, ll p, vector<ll>&fac, vector<ll>&inv_fac) {
if (n < m) return 0;
return fac[n]*inv_fac[m]%p*inv_fac[n-m]%p;
}
ll lucas(ll n, ll m, ll p, vector<ll>&fac, vector<ll>&inv_fac) {
if (n < m) return 0;
ll ans = 1;
while(true) {
if (m == 0) return ans;
if (n < p && m < p) return ans*combination(n,m,p,fac,inv_fac)%p;
ans = ans * combination(n%p,m%p,p,fac,inv_fac)%p;
n/=p; m/=p;
}
}
lucas定理 模板的更多相关文章
- 【HDU 3037】Saving Beans Lucas定理模板
http://acm.hdu.edu.cn/showproblem.php?pid=3037 Lucas定理模板. 现在才写,noip滚粗前兆QAQ #include<cstdio> #i ...
- 大组合数取模之lucas定理模板,1<=n<=m<=1e9,1<p<=1e6,p必须为素数
typedef long long ll; /********************************** 大组合数取模之lucas定理模板,1<=n<=m<=1e9,1&l ...
- Lucas定理模板【bzoj2982】【combination】
(上不了p站我要死了,侵权度娘背锅) Description LMZ有n个不同的基友,他每天晚上要选m个进行[河蟹],而且要求每天晚上的选择都不一样.那么LMZ能够持续多少个这样的夜晚呢?当然,LMZ ...
- 【组合数+Lucas定理模板】HDU 3037 Saving
acm.hdu.edu.cn/showproblem.php?pid=3037 [题意] m个松果,n棵树 求把最多m个松果分配到最多n棵树的方案数 方案数有可能很大,模素数p 1 <= n, ...
- BZOJ 4403 2982 Lucas定理模板
思路: Lucas定理的模板题.. 4403 //By SiriusRen #include <cstdio> using namespace std; ; #define int lon ...
- Lucas定理模板
用于大组合数对p取模的计算. #include <cstdio> #include <iostream> #include <cmath> #include < ...
- HDU 3037 Saving Beans(Lucas定理模板题)
Problem Description Although winter is far away, squirrels have to work day and night to save beans. ...
- xdoj-1057(Lucas定理的证明及其模板)
Lucas定理的证明: 转自百度百科(感觉写的还不错) 首先你需要这个算式: ,其中f > 0&& f < p,然后 (1 + x) nΞ(1 + x) sp+q Ξ ...
- 组合数取模&&Lucas定理题集
题集链接: https://cn.vjudge.net/contest/231988 解题之前请先了解组合数取模和Lucas定理 A : FZU-2020 输出组合数C(n, m) mod p (1 ...
随机推荐
- Ubuntu解决 MariaDB无密码就可以登录的问题
使用apt-get来安装mysql,安装好之后发现安装的是 MariaDB,如下,无需密码既可以登录了.即使使用mysqladmin或mysql_secure_installation 设置好密码,用 ...
- SDL初始化和创建窗口
//初始化SDL2和创建一个窗口,并且将屏幕绘制成大红色 #include <iostream> extern "C" { #include <SDL.h> ...
- illegal use of this type as an expression
学习MCI时看别人样例手敲代码出现的一个很经典的错误. 在C语言中定义的变量没有放在函数的开头. #include <string.h> #include <windows.h> ...
- 【WPF学习】第四十二章 透明
WPF支持真正的透明效果.这意味着,如果在一个性质或元素上层叠另外几个形状或元素,并让所有这些形状和元素具有不同的透明度,就会看到所期望的效果.通过该特性能够创建透过上面的元素可以看到的的图像背景,这 ...
- 【译文连载】 理解Istio服务网格(第二章 安装)
全书目录 第一章 概述 本文目录 1.命令行工具安装 2. Kubernetes/OpenShift安装 3. Istio安装 4.示例Java微服务安装 4.1 源码概览 4.2 编译和部署cust ...
- TCP协议三次握手(通信)
在<计算机网络>一书中其中有提到,三次握手的目的是“为了防止已经失效的连接请求报文段突然又传到服务端,因而产生错误”,这种情况是:一端(client)A发出去的第一个连接请求报文并没有丢失 ...
- 低功耗蓝牙ATT/GATT/Profile/Service/Characteristic规格解读
什么是蓝牙service和characteristic?到底怎么理解蓝牙profile?ATT和GATT两者如何区分?什么又是attribute?attribute和characteristic的区别 ...
- 通过open上网并设置开机自启与自动连接
注意:这里所说的上网并不是FQ.只是简单的通过iptables让客户端可以访问外网.因为有些时候有这样的需求 上一篇文章为大家介绍了OpenVPN.以及它的部署工作.而这一篇主要就是讲解如何让客户端可 ...
- 怎么理解Laravel的核心架构
使用过larave框架的朋友都知道laravel框架里面除了提供一些基本的功能(如控制器.视图.模型)之外,还有中间件.门面.契约等,这些东西是如何在laravel框架运用起来的呢?今天就和大家详聊一 ...
- IP multicast IP多播
https://networklessons.com/multicast/multicast-routing/ IP多播有两种模式,密集模式和稀疏模式: Dense Mode Sparse Mode ...