遥远的\(\mod p\)(\(p\)是质数)大陆有一个恶魔:\[C(m,n)={m!\over n! (m-n)!}\]

于是大家有了各种求逆元的方法。这里MOD = p

for (int i = 0; i < MOD; i ++)
    rev_fact[i] = pow_mod(i, MOD - 2, MOD);
rev_fact[MOD - 1] = pow_mod(MOD - 1, MOD - 2, MOD);
for (int i = MOD - 2; i >= 0; i --)
    rev_fact[i] = (i64) rev_fact[i + 1] * (i + 1) % MOD;

下面的方法正确性在这里

rev_fact[0] = rev_fact[1] = 1;
for (int i = 2; i < MOD; i ++)
    rev_fact[i] = (i64) rev_fact[MOD % i] * (MOD - MOD / i) % MOD;
int mod_inverse(int a, int m) {
    int x, y;
    extgcd(a, m, x, y);
    return (m + x % m) % m;
}
rev_fact[0] = 1;
for (int i = 1; i < MOD; i ++) rev_fact[i] = mod_inverse(i, MOD);

当然,最后都要加上:

for (int i = 2; i < MOD; i ++)
    rev_fact[i] = (i64) rev_fact[i] * rev_fact[i - 1] % MOD;

通过上面的预处理,有人使用下面的方法来对抗恶魔:

int C(int m, int n) {
    return (i64) fact[m] * rev_fact[n] % MOD * rev_fact[m - n] % MOD;
}

这样,\(\mod p\)大陆稳定了一段时间。

随着恶魔力量不断加强,\(m,n\)不断变大,甚至超过了\(p\)。

于是大家尝试通过计算\(n! \mod p\),进而计算\(C(m,n)\)。

有人说,当\(n < p\)时,\(n! \equiv 0 \mod p\)。
又有反对的声音:我们应该把被\(p\)整除的因子提出来。
于是有人提出计算\(n! \mod p\)的方法,来计算\(n!\equiv a p^e\):

int mod_fact(int n, int p, int &e) {
    e = 0;
    if (n == 0) return 1;
    int ret = mod_fact(n / p, p, e);
    e += n / p;
    // 根据威尔逊定理  (p-1)! = -1
    if ((n / p) & 1) return (int) res * (p - fact[n % p]) % p;
    return (int) res * fact[n % p] % p;
}

这时,大家告诉有人,他找到了Lucas定理

于是,恶魔就这样被虐了!

int Lucas(int m, int n) {
    if (n > m) return 0;
    if (m < 0 || n < 0) return 0;
    if (m < MOD && n < MOD)
        return (i64) fact[m] * rev_fact[n] % MOD *
            rev_fact[m - n] % MOD;
    else
        return (i64) Lucas(m / MOD, n / MOD) *
            Lucas(m % MOD, n % MOD) % MOD;
}

大家和有人的两个名字流传千古。不过另外一个\(\mod p\)大陆又出现了问题,这里\(p\)不是质数,他们能顶住恶魔的进攻吗?有人建议,去东方找着中国剩余定理!!

传送门:

详解
Lucas定理
费马小定理

关于C(m,n)%p的故事的更多相关文章

  1. 背后的故事之 - 快乐的Lambda表达式(一)

    快乐的Lambda表达式(二) 自从Lambda随.NET Framework3.5出现在.NET开发者眼前以来,它已经给我们带来了太多的欣喜.它优雅,对开发者更友好,能提高开发效率,天啊!它还有可能 ...

  2. 2000条你应知的WPF小姿势 基础篇<28-33 WPF启动故事>

    在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000Things You Should Know About C# 和 2,0 ...

  3. 背后的故事之 - 快乐的Lambda表达式(二)

    快乐的Lambda表达式 上一篇 背后的故事之 - 快乐的Lambda表达式(一)我们由浅入深的分析了一下Lambda表达式.知道了它和委托以及普通方法的区别,并且通过测试对比他们之间的性能,然后我们 ...

  4. UDAD 用户故事驱动的敏捷开发 – 演讲实录

    敏捷发展到今天已经在软件行业得到了广泛认可,但大多数敏捷方法都是为了解决某一特定问题而总结出来的特定方法或实践,一直缺乏一个可以将整个开发过程串接起来的成体系的方法.用户故事驱动的敏捷开发(User ...

  5. iOS系列 基础篇 02 StoryBoard 故事板文件

    iOS基础 02 StoryBoard 故事板文件 目录: 1. 故事板的导航特点 2. 故事板中的Scene和Segue 3. 本文最后 在上篇HelloWorld工程中有一个Main.storyb ...

  6. 前端少侠的ps故事

    前端少侠的ps故事 正所谓,码在江湖,身不由己.自21世纪前后端分离,代码分工细化以来,前端与设计的合作也变得越来越重要.有人说,如果前端懂设计的话,工作会更快一点.倘若说我入前端半年能算半个前端少侠 ...

  7. 【码在江湖】前端少侠的json故事(上)日月第一击

    日月第一击 这是我前端生涯第一次和后台对接,其经历真是苦不堪言,多次绝处逢生,柳暗花明,可就是迟迟见不到那条村子.当然,最后我还是完成了这次对接.下面来聊一聊我这白痴一般的经历. 序章 话说天下大势, ...

  8. 【码在江湖】前端少侠的json故事(下):jsonp的应用

    jsonp的应用 话说天下大势,分久必合,合久必分,代码江湖自进入21世纪以来,前后端分离成为了大势所趋,代码分工更为精细,更为深入,而正所谓码在江湖,身不由己,为了更好的实现需求,程序猿们必须不断学 ...

  9. 【码在江湖】前端少侠的json故事(中)ng的json

    ng的json 正所谓"人在江湖,身不由己",在开发之路上前端少侠dk遇到过种种困难,尤其在与后端进行数据对接的时候,不得不逼迫自己以极快的速度去学习和掌握一些奇招怪式,正当他以为 ...

  10. 初识WEB:输入URL之后的故事

    1. 概述2. HTTP请求过程3. 相关性能检测及优化手段4. 浏览器的呈现过程5. 浏览器的呈现引擎6. 引用及延伸阅读 概述 为什么输入www.cnblogs.com之后敲一个回车,浏览器就会显 ...

随机推荐

  1. 杭电oj A + B Again

    A + B Again Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  2. 设计模式值六大原则——迪米特法则(LoD)也称为最少知识原则(LKP)。

    定义: 迪米特法则(Law of Demeter,LoD)也称为最少知识原则(Least Knowledge Principle,LKP). 一个对象应该对其他对象有最少的了解.通俗地讲,一个类应该对 ...

  3. [LeetCode]题解(python):019-Remove Nth Node From End of List

    题目来源: https://leetcode.com/problems/remove-nth-node-from-end-of-list/ 题意分析: 这道题是给定一个链表,删除倒数第n个节点.提醒, ...

  4. 海量Web日志分析 用Hadoop提取KPI统计指标

    http://blog.fens.me/hadoop-mapreduce-log-kpi/ http://dongxicheng.org/search-engine/scribe-installati ...

  5. QT 遍历目录查找指定文件(比较简单)

    QString FindFile(const QString &strFilePath, const QString &strNameFilters){ if (strFilePath ...

  6. poj 3984 迷宫问题(dfs)

    题目链接:http://poj.org/problem?id=3984 思路:经典型的DFS题目.搜索时注意剪枝:越界处理,不能访问处理. 代码: #include <iostream> ...

  7. Objective-C基础教程读书笔记(7)

    第7章 深入了解Xcode Xcode是一个很好用的工具,有很多强大的功能,不过并不是所有的功能都易于发现.如果你打算长期使用这个强大的工具,就肯定要尽可能多了解它.本章将介绍一些Xcode编辑器的使 ...

  8. TCP/IP之DNS域名解析系统

    DNS系统是一个分布式的数据库,当一个数据库发现自己并没有某查询所需要的数据的时候,它将把查询转发出去,而转发的目的地通常是根服务器,根服 务器从上至下层层转发查询,直到找到目标为止.DNS还有一个特 ...

  9. ST官方翻译的中文应用笔记汇总

    ST官方翻译的中文应用笔记汇总 http://www.51hei.com/stm32/3382.html 官方中文AN:AN3116:STM32? 的 ADC 模式及其应用AN1015:用于提高微控制 ...

  10. goahead cgi 及出现的问题解决

    1. route.txt    配置cgi路径 route uri=/cgi-bin dir=/web handler=cgi 2.交叉编译生成cgi goahead  源码路径下  ./test/c ...