Lucas定理:线性求所有逆元的方法
Miskcoo's Space,版权所有丨如未注明,均为原创
转载请注明转自:http://blog.miskcoo.com/2014/09/linear-find-all-invert
主要绕过费马小定理来证明lucas定理,挺有意思..此外设置多进制计算机可以通过移位运算直接加快多进制运算的速度。
1.Lucas定理
Lucas定理详解
Lucas定理解决的问题是组合数取模。数学上来说,就是求 (nm)modp
。
这里n,m
可能很大,比如达到 1015 ,而 p 在 109
以内。显然运用常规的阶乘方法无法直接求解,所以引入Lucas定理。
Lucas定理
把n
和 m 写成 p 进制数的样子(如果长度不一样把短的补成长的那个的长度):
n=(a0a1…ak)p
m=(b0b1…bk)p
那么:
(nm)≡∏ki=0(aibi)modp
证明
如果把Lucas定理从递归的角度理解,它其实是这样的:
设n=ap+b,m=cp+d,(b,d<p,a=⌊np⌋,c=⌊mp⌋)(nm)≡(ac)∗(bd)
这个定理的一个很巧妙的证法是通过二项式定理来说明上面的式子是成立的。
首先,对于任意质数pp,有:
(1+x)p≡1+xpmodp
其证明可以由费马小定理(xp≡xmodp) |p为素数)
直接得出:
(1+x)p≡1+x
xp≡x
所以 (1+x)p≡1+x≡1+xp
(当然同样也有(a+b)p≡ap+bpmodp
,具体为什么你可以拆开前面的式子,将其除 ap 和 bp 项外的所有项的系数好好研究一下(其实就是杨辉三角的第p层),可以发现把对称项系数分别合并后都能整除 p
)
利用这个性质,我们证明Lucas定理:
(1+x)n=(1+x)⌊np⌋∗p(1+x)b=(1+xp)⌊np⌋(1+x)b=∑i=0k(⌊np⌋i)xpi∑j=0k(bj)xj
考察等式左右两边xmxm的系数,可以发现:
左边右边=(nm)=(⌊np⌋i)(bj),(pi+j=m,j<p)=(⌊np⌋⌊mp⌋)(bd)
所以上面的式子成立,证明完毕。
如果不算预处理什么的,算法时间复杂度为O(logpn)
。如果能够支持预处理,那么就加一个 O(p) ,要不就用快速幂,乘上 O(logp) 。
2. 线性求所有逆元的方法
前几天在看 lucas 定理的时候发现要求 1, 2,⋯,p−1modp 的逆元,然后就看到了一个 Θ(n)
的做法发现太神了,虽然想起来是挺简单的
这个做法实际上是这样的,首先 1−1≡1(modp)
然后我们设 p=k⋅i+r, r<i, 1<i<p
再将这个式子放到modp
意义下就会得到
两边同时乘上 i−1⋅r−1
就会得到
于是就可以从前面推出当前的逆元了,代码也就一行
A[i] = -(p / i) * A[p % i];
Related posts:
- [数论]Miller-Rabin素性测试
- [数论]二次剩余及计算方法
- 扩展欧几里得算法与中国剩余定理
- BZOJ-3157. 国王奇遇记
- BZOJ-3771. Triple
Lucas定理:线性求所有逆元的方法相关推荐
- 线性求所有逆元的方法
http://blog.miskcoo.com/2014/09/linear-find-all-invert 转载于:https://www.cnblogs.com/SXia/p/6747779.ht ...
- 2015 ICL, Finals, Div. 1 Ceizenpok’s formula(组合数取模,扩展lucas定理)
J. Ceizenpok's formula time limit per test 2 seconds memory limit per test 256 megabytes input stand ...
- hdu 3944 DP? (Lucas 定理)
仔细观察杨辉三角后可以发现从最高点到第n行第k个数的最短路为c(n+1,k); 根据Lucas定理可以求出,一般来说要求答案模去一个质数p且p的范围不大于10^5则可用Lucas. Lucas(n,m ...
- 取模除法(逆元)(费马小定理)(线性求逆元)
文章目录 引言 逆元 费马小定理 内容 应用 证明 线性求逆元 thanks for reading! 引言 我们做题时经常会由于答案过大,被要求使答案对一个质数取模 我们都知道,加和乘对取模是没有影 ...
- 无数种求逆元的方法总结
乘法逆元 对于缩系中的元素,每个数a均有唯一的与之对应的乘法逆元x,使得ax≡1(mod n) 一个数有逆元的充分必要条件是gcd(a,n)=1,此时逆元唯一存在 逆元的含义:模n意义下,1个数a如 ...
- 线性求逆元模板_算法学习笔记(9):逆元
https://zhuanlan.zhihu.com/p/105467597在数论中,如果 ,我们就说 和 在模 意义下互为乘法逆元,记作 . 逆元有什么用呢?我们常常遇到一些题目要求结果对一个大质数 ...
- 组合计数——车的放置(逆元)+数三角形+序列统计(lucas定理)
通用传送门:https://www.acwing.com/activity/content/16/ 思路:设C(a,b)为从a中取出b个的组合数,设A(a,b)从a中选出b个进行排列的排列数. 对于题 ...
- 【训练题22:线性求逆元】【模板】乘法逆元 | 洛谷 P3811
[模板]乘法逆元 难度 普及/提高\color{yellow}普及/提高普及/提高 板子题,给出两种方法 题意 给 n,pn,pn,p 求出所有 i∈[1,n]i\in[1,n]i∈[1,n]在模 p ...
- 线性求逆元模板_ZXBlog/ACM模板(C++).md at bb6f2522054d5370df79222461293721e8edede2 · cw1027/ZXBlog · GitHub...
ACM模板(C++) 1.大数 加法,乘法模板 //题目链接 : http://poj.org/problem?id=2506 //题目大意 : 就是问你用2*1,1*2,2*2的砖拼成2*n的长方形 ...
最新文章
- 管理索引表:深入研究B树索引--重建,合并,删除(理论篇3)
- 600度近视眼恢复方法_近视眼了怎么办?试试这几种方法,或许能奏效
- tomcat catalina.home和catalina.base区别(转)
- shuffleNetv2 测试
- hdu1280 前m大的数(数组下标排序)
- CC++ Calling Convention
- c语言pi算法程序,C语言计算圆周率PI
- 有何特长及英语计算机水平怎么写,熟悉专业有何特长填写(范文篇).doc
- 解决Android Studio不提示控件的XML属性
- 【kindle技巧】用Calibre给txt文件生成目录,epub格式制作,电子书格式生成
- 小鹏高增长下的隐忧:太像特斯拉是一个魔咒?
- 你真的会用K折交叉吗?对于K折交叉的思考 | K折交叉的坑
- 一个系列搞懂Mysql数据库12:从实践sql语句优化开始
- neon浮点运算_ARM NEON指令集优化理论与实践
- 阿里怎么发工资?自研薪酬管理系统首次曝光
- 神经网络与智能信息处理
- 超大容量远距离传输解决方案如何设计?
- 【S0019】【素材】32套让你脱颖而出的作品集模板,人人必备
- ceph设置副本的数目-2019014补
- 非对称加密与数字签名的介绍与使用