关于C(m,n)%p的故事
序
遥远的\(\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\)不是质数,他们能顶住恶魔的进攻吗?有人建议,去东方找着中国剩余定理!!
传送门:
关于C(m,n)%p的故事的更多相关文章
- 背后的故事之 - 快乐的Lambda表达式(一)
快乐的Lambda表达式(二) 自从Lambda随.NET Framework3.5出现在.NET开发者眼前以来,它已经给我们带来了太多的欣喜.它优雅,对开发者更友好,能提高开发效率,天啊!它还有可能 ...
- 2000条你应知的WPF小姿势 基础篇<28-33 WPF启动故事>
在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000Things You Should Know About C# 和 2,0 ...
- 背后的故事之 - 快乐的Lambda表达式(二)
快乐的Lambda表达式 上一篇 背后的故事之 - 快乐的Lambda表达式(一)我们由浅入深的分析了一下Lambda表达式.知道了它和委托以及普通方法的区别,并且通过测试对比他们之间的性能,然后我们 ...
- UDAD 用户故事驱动的敏捷开发 – 演讲实录
敏捷发展到今天已经在软件行业得到了广泛认可,但大多数敏捷方法都是为了解决某一特定问题而总结出来的特定方法或实践,一直缺乏一个可以将整个开发过程串接起来的成体系的方法.用户故事驱动的敏捷开发(User ...
- iOS系列 基础篇 02 StoryBoard 故事板文件
iOS基础 02 StoryBoard 故事板文件 目录: 1. 故事板的导航特点 2. 故事板中的Scene和Segue 3. 本文最后 在上篇HelloWorld工程中有一个Main.storyb ...
- 前端少侠的ps故事
前端少侠的ps故事 正所谓,码在江湖,身不由己.自21世纪前后端分离,代码分工细化以来,前端与设计的合作也变得越来越重要.有人说,如果前端懂设计的话,工作会更快一点.倘若说我入前端半年能算半个前端少侠 ...
- 【码在江湖】前端少侠的json故事(上)日月第一击
日月第一击 这是我前端生涯第一次和后台对接,其经历真是苦不堪言,多次绝处逢生,柳暗花明,可就是迟迟见不到那条村子.当然,最后我还是完成了这次对接.下面来聊一聊我这白痴一般的经历. 序章 话说天下大势, ...
- 【码在江湖】前端少侠的json故事(下):jsonp的应用
jsonp的应用 话说天下大势,分久必合,合久必分,代码江湖自进入21世纪以来,前后端分离成为了大势所趋,代码分工更为精细,更为深入,而正所谓码在江湖,身不由己,为了更好的实现需求,程序猿们必须不断学 ...
- 【码在江湖】前端少侠的json故事(中)ng的json
ng的json 正所谓"人在江湖,身不由己",在开发之路上前端少侠dk遇到过种种困难,尤其在与后端进行数据对接的时候,不得不逼迫自己以极快的速度去学习和掌握一些奇招怪式,正当他以为 ...
- 初识WEB:输入URL之后的故事
1. 概述2. HTTP请求过程3. 相关性能检测及优化手段4. 浏览器的呈现过程5. 浏览器的呈现引擎6. 引用及延伸阅读 概述 为什么输入www.cnblogs.com之后敲一个回车,浏览器就会显 ...
随机推荐
- Oracle 传参错误
错误:ORA-01008: 并非所有变量都已绑定 报错的SQL:UPDATE RES_AUTHORITY SET F_APPLYER= ...
- JS拖动浮动DIV
<!DOCTYPE html> <html> <head> <meta charset="utf8"> <title>j ...
- linux小命令
本文主要记录了我在工作中用到的一些linux命令 1.查询linux系统是32位还是64位 zhaolei@zhaolei :~# file /usr/bin/whoami/usr/bin/whoam ...
- nginx的 CPU参数worker_processes和worker_cpu_affinity使用说明
官方说明: http://wiki.nginx.org/NginxChsHttpMainModule#worker_cpu_affinity http://wiki.nginx.org/NginxCh ...
- Linux android studio :'tools.jar' seems to be not in Android Studio classpath.
问题: 'tools.jar' seems to be not in Android Studio classpath.Please ensure JAVA_HOME points to JDK ra ...
- FMDB的基本应用
FMDB简介 iOS中原生的SQLite API在进行数据存储的时候,需要使用C语言中的函数,操作比较频繁.于是,就出现了一系列将AQLite API进行封装的库,例如FMDB.PlausibleDa ...
- Girls' research(manacher)
Girls' research Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) ...
- iOS开发之理解iOS中的MVC设计模式
模型-视图-控制器(Model-View-Controller,MVC)是Xerox PARC在20世纪80年代为编程语言Smalltalk-80发明的一种软件设计模式,至今已广泛应用于用户交互应用程 ...
- Xcode 静态库调试策略
Xcode 静态库调试策略 (已经有现成的工程和静态库源码) ***** 为安全期间建议备份一下静态库 Step1: 下载最新的工程[工程中有所要测试的静态库和头文件需要删除]: Step2: ...
- Spring MVC整体处理流程
一.spring整体结构 首先俯视一下spring mvc的整体结构 二.处理流程 1.请求处理的第一站就是DispatcherServlet.它是整个spring mvc的控制核心.与大多数的jav ...