卢卡斯定理Lucas

在数论中,\(Lucas\)定理用于快速计算\(C^m_n ~ \% ~p\),即证明\(C^m_n = \prod_{i = 0} ^kC^{m_i}_{n_i}\)其中\(m_i\)为\(m\)的因式分解,\(n_i\)为\(n\)的因式分解,\(p\)为质数。

由\(Edward~Lucas\)在1878年提出。

证明:

首先我们将\(C^i_p\)进行一下变式即\(C^i_j = \frac{p!}{i!(p - i)!}\),提出来一个\(\frac{p}{i}\)也就等于\(\frac{p}{i} \times \frac{(p - 1)!}{(i - 1)!(p - i)}\)。因此我们推出:

\(C^i_p \equiv \frac{p}{i}C^{i - 1}_{P - 1} \equiv 0 ~(mod~p)\)。其中\(1 \leq i \leq p - 1\)

然后我们得到:

\((X +1)^p \equiv C_p^01^p + C_p^1X^2 + ... + C_P^PX^P\)(实际上就是个多项式展开...)

同时又同余\(C_p^01^pX^0 + C_p^p1^0X^p \equiv 1 + X^p (mod ~p)\)

因此我们又推出:

\((1 + X)^p \equiv 1 + X^p (mod ~ p)\)

接着我们可以利用数学归纳法求出\((1 +X)^{p^i} \equiv 1 + X^{p^i} (mod~ p)\)。接下来将\(m\)用\(p\)进制数表示就是\(\sum_{i = 0} ^km_ip^i\)。

并且我们还可以看出\(\sum_{n = 0}^{m} C_n^mX^n = (1 +X)^m = \prod _{i = 0}^k((1 + X)^{p^i})^{m_i} = \prod _{i = 0}^k(1 + X^{p^i})^{m_i} = \prod _{i = 0}^k(\sum_{n_i = 0}^{m_i} C_{n_i}^{m_i}X^{n_ip^i})\)
也就等于\(\prod _{i = 0}^k(\sum_{n_i = 0}^{p - 1} C_{n_i}^{m_i}X^{n_ip^i}) = \sum_{n_i = 0}^{k} (\prod_{i - 0}^kC_{n_i}^{m_i})X^n ~ (mod ~ p)\)

因为\(n_i\)为\(n\)的\(p\)进制表示,因此得证。

模板:(Link

#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std ;
typedef long long LL ;
const int MAXN = 100010 ;
LL N, M, P, X[MAXN] ;

inline LL Read() {
    LL X = 0, F = 1 ; char ch = getchar() ;
    while (ch > '9' || ch < '0') F = (ch == '-' ? - 1 : 1), ch = getchar() ;
    while (ch >= '0' && ch <= '9') X=(X<<1)+(X<<3)+(ch^48), ch = getchar() ;
    return X * F ;
}

inline LL QuickPow(LL A, LL B) {
    LL Ans = 1 ;    if (! B) return 1 % P ;
    while (B) {
        if (B & 1) Ans = Ans * A % P ;
        A = A * A % P, B >>= 1 ;
    }   return Ans ;
}

inline LL C(LL A, LL B) {
    if (B > A) return 0 ;
    return (X[A] * QuickPow(X[B], P - 2)) % P * QuickPow(X[A - B], P - 2) % P ;
}

inline LL Lucas(LL A, LL B) {
    if (! B) return 1 ;
    else return (C(A % P, B % P) * Lucas(A / P, B / P)) % P ;
}

int main() {
    int T = Read() ; while (T --) {
        N = Read(), M = Read(), P = Read() ;
        X[0] = 1 ;
        for (LL i = 1 ; i <= P ; i ++)
            X[i] = (X[i - 1] * i) % P ;
        LL Ans = Lucas(N + M, N) ;
        printf("%lld\n", Ans) ;
    }   return 0 ;
}

卢卡斯定理Lucas的更多相关文章

  1. 【luogu P3807】【模板】卢卡斯定理/Lucas 定理(含 Lucas 定理证明)

    [模板]卢卡斯定理/Lucas 定理 题目链接:luogu P3807 题目大意 求 C(n,n+m)%p 的值. p 保证是质数. 思路 Lucas 定理内容 对于非负整数 \(n\),\(m\), ...

  2. 卢卡斯定理 Lucas (p为素数)

    证明摘自:(我网上唯一看得懂的证明) https://blog.csdn.net/alan_cty/article/details/54318369 结论:(显然递归实现)lucas(n,m)=luc ...

  3. 洛谷.3807.[模板]卢卡斯定理(Lucas)

    题目链接 Lucas定理 日常水题...sublime和C++字体死活不同步怎么办... //想错int范围了...不要被longlong坑 //这个范围现算阶乘比预处理快得多 #include &l ...

  4. Lucas 卢卡斯定理

    Lucas: 卢卡斯定理说白了只有一条性质 $$ C^n_m \equiv C^{n/p}_{m/p} \times C^{n \bmod p}_{m \bmod p} \ (mod \ \ p) $ ...

  5. 数论篇7——组合数 & 卢卡斯定理(Lucas)

    组合数 组合数就是高中排列组合的知识,求解组合数C(n,m),即从n个相同物品中取出m个的方案数. 求解方式 求解通式:$C^{m}_{n}=\dfrac {n!}{m!\left( n-m\righ ...

  6. CRT中国剩余定理 & Lucas卢卡斯定理

    数论_CRT(中国剩余定理)& Lucas (卢卡斯定理) 前言 又是一脸懵逼的一天. 正文 按照道理来说,我们应该先做一个介绍. 中国剩余定理 中国剩余定理,Chinese Remainde ...

  7. 【BZOJ4403】序列统计(组合数学,卢卡斯定理)

    [BZOJ4403]序列统计(组合数学,卢卡斯定理) 题面 Description 给定三个正整数N.L和R,统计长度在1到N之间,元素大小都在L到R之间的单调不降序列的数量.输出答案对10^6+3取 ...

  8. 【Luogu3807】【模板】卢卡斯定理(数论)

    题目描述 给定\(n,m,p(1≤n,m,p≤10^5)\) 求 \(C_{n+m}^m mod p\) 保证\(P\)为\(prime\) \(C\)表示组合数. 一个测试点内包含多组数据. 输入输 ...

  9. 【数论】卢卡斯定理模板 洛谷P3807

    [数论]卢卡斯定理模板 洛谷P3807 >>>>题目 [题目] https://www.luogu.org/problemnew/show/P3807 [输入格式] 第一行一个 ...

随机推荐

  1. Access MetaData

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  2. canvas toDataURL() 方法如何生成部分画布内容的图片

    HTMLCanvasElement.toDataURL() 方法返回一个包含图片展示的 data URI .可以使用 type参数其类型,默认为 PNG 格式.图片的分辨率为96dpi. 如果画布的高 ...

  3. order by 多条件查询 case when

    场景:在按照条件查询后,排序按照不同的条件排序,以及同一个条件 正序和倒序排序.可以考虑使用. 遇到的排序条件:按照直播的状态,根据条件排序.直播的状态包括:直播.置顶.预告.回放.过期预告.排序条件 ...

  4. 记作为前端开发人员跑去面试C#.NET

    先谈结果,"秦总",与我面试讨论一个半小时,十分感动,然后拒绝了我. 本月17日16时许,收到邀请,于18日9时到司面试,虽如今仅深入前端领域,皆因曾有1年ASP.NET(C#)的 ...

  5. c# 设计模式 之:抽象工厂

    1.作用:抽象工厂的目的就是生产[产品族],之前讲的“工厂模式”的每一个factory只造一种产品,抽象工厂让一个factory造多个产品. uml类图: 代码实现: 抽象工厂代码: namespac ...

  6. ERP行业销售如何挖掘潜在客户?

    要看不同阶段,小企业发展到一定程度,第一个需求是单体财务系统.因为这个时候财务忙不过来了.在大一点就需要业务系统了,就是生产+进销存.有分公司就有集团级软件需求,接着就是oa啊HR啊上下游管理啊等等. ...

  7. Java学习---Map的学习

    1. Map 1.1. map中的方法 1.2. Map.Entry 对于集合来讲,就是把kye-value的数据保存在了Map.Entry的实例之后,再在Map集合中插入了一个Map.Entry的实 ...

  8. 7 Dockerfile指令详解 && VOLUME 指令

    格式为: VOLUME ["<路径1>", "<路径2>"...] VOLUME <路径> 之前我们说过,容器运行时应该尽量 ...

  9. docker 17.09.0-ce 启动更换网络地址

    一.环境准备 环境1 台虚拟机,系统为centos7 二.17.09.0-ce 安装 卸载安装的所有Docker组件 在 Docker17.03.0-ce 版本中,与在 Docker 1.12 中引入 ...

  10. July 27th 2017 Week 30th Thursday

    A smile is the most charming part of a person forever. 微笑永远是一个人身上最好看的东西. Smile in the mirror, and yo ...