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(plog⁡2p)O(p\log_2{p})O(plog2​p)。空间复杂度O(p)O(p)O(p)。预处理之后,单次求(nm) mod p\tbinom{n}{m} \bmod p(mn​)modp复杂度O(log⁡pm)O(\log_{p}{m})O(logp​m)]{}

洛谷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定理 模板的更多相关文章

  1. 【HDU 3037】Saving Beans Lucas定理模板

    http://acm.hdu.edu.cn/showproblem.php?pid=3037 Lucas定理模板. 现在才写,noip滚粗前兆QAQ #include<cstdio> #i ...

  2. 大组合数取模之lucas定理模板,1<=n<=m<=1e9,1<p<=1e6,p必须为素数

    typedef long long ll; /********************************** 大组合数取模之lucas定理模板,1<=n<=m<=1e9,1&l ...

  3. Lucas定理模板【bzoj2982】【combination】

    (上不了p站我要死了,侵权度娘背锅) Description LMZ有n个不同的基友,他每天晚上要选m个进行[河蟹],而且要求每天晚上的选择都不一样.那么LMZ能够持续多少个这样的夜晚呢?当然,LMZ ...

  4. 【组合数+Lucas定理模板】HDU 3037 Saving

    acm.hdu.edu.cn/showproblem.php?pid=3037 [题意] m个松果,n棵树 求把最多m个松果分配到最多n棵树的方案数 方案数有可能很大,模素数p 1 <= n, ...

  5. BZOJ 4403 2982 Lucas定理模板

    思路: Lucas定理的模板题.. 4403 //By SiriusRen #include <cstdio> using namespace std; ; #define int lon ...

  6. Lucas定理模板

    用于大组合数对p取模的计算. #include <cstdio> #include <iostream> #include <cmath> #include < ...

  7. HDU 3037 Saving Beans(Lucas定理模板题)

    Problem Description Although winter is far away, squirrels have to work day and night to save beans. ...

  8. xdoj-1057(Lucas定理的证明及其模板)

    Lucas定理的证明: 转自百度百科(感觉写的还不错) 首先你需要这个算式:    ,其中f > 0&& f < p,然后 (1 + x) nΞ(1 + x) sp+q Ξ ...

  9. 组合数取模&&Lucas定理题集

    题集链接: https://cn.vjudge.net/contest/231988 解题之前请先了解组合数取模和Lucas定理 A : FZU-2020  输出组合数C(n, m) mod p (1 ...

随机推荐

  1. CUDA学习(三)之使用GPU进行两个数相加

    在CPU上定义两个数并赋值,然后使用GPU核函数将两个数相加并返回到CPU,在CPU上显示 #include "cuda_runtime.h" #include "dev ...

  2. CAD制图系列之如何画内切圆

    今天我将记录我们如何画一个大圆,里面均匀内切四个小圆 具体步骤如下: 第一步:首先,先画一个十字架,用于作为轴 第二步:以十字架交点为圆心,画一个半径为25的圆 第三步:以中点为坐标画四十五度斜线,方 ...

  3. 实验7:交换机IOS升级

    交换机IOS升级首先需要有IOS文件,如果没有备份原文件的话,可以找个同一版本的IOS来替代. 第一种方法:X-Modem 以前我曾经尝试过一种方法,就是当Flash被删除后,启动无法进入系统,可以用 ...

  4. Spring(六)核心容器 - 注册单例 Bean 实例、SingletonBeanRegistry 简介

    前言 上篇文章我们对注册 Bean 的核心类 BeanDefinitionRegistry 进行了讨论,这里的注册 Bean 是指保存 Bean 的相关信息,也就是将 Bean 定义成 BeanDef ...

  5. mybatis缓存,从一个“灵异”事件说起

    刚准备下班走人,被一开发同事叫住,让帮看一个比较奇怪的问题:Mybatis同一个Mapper接口的查询方法,第一次返回与第二次返回结果不一样,百思不得其解! 问题 Talk is cheap. Sho ...

  6. data structure test

    1.设计算法,对带头结点的单链表实现就地逆置.并给出单链表的存储结构(数据类型)的定义. #include <iostream> #include <cstdlib> #inc ...

  7. Linux服务器上python2升为python3.6

    如何在在Linux服务器上吧Python2升级为Python3 最近白嫖了一年的服务器,打算在服务器上跑一个Python项目,没想到居然预装的是Python2.7.5.本来是打算把Python2.7. ...

  8. Codeforces_712_A

    http://codeforces.com/contest/712/problem/A 水题,写出来就看到规律了. #include<iostream> #include<cstri ...

  9. 安装MinGW出现 mingw-get: *** ERROR *** Get package:

    个人的解决方法: 1.手机开个热点让电脑连上. 2.在Setting里面讲proxy关闭.

  10. php 截取字符串长度 并 把超出规定长度的内容用...替代

    <?php header("content-type:text/html;charset=utf-8");#设置文件编码 error_reporting(E_ALL);#设置 ...