• 前言
  • 有关乘法逆元定义
  • 费马小定理
  • 乘法逆元(编程计算)
    • 有关乘法逆元题目

      • (AtCoder - 1974)いろはちゃんとマス目 / Iroha and a Grid(乘法逆元+组合计数)

前言

看到这里的小盆友们千万不要觉得这个东西很难,其实就是个1+1->1(1个定义+1个定理->1坨乘法逆元).Let’s begin.

有关乘法逆元定义

这个我们就不要玩笑了,来,直接看定义:
乘法:是指将相同的数加起来的快捷方式。(呵呵呵)
逆元素:指一个可以取消另一给定元素运算的元素,在数学里,逆元素广义化了加法中的加法逆元和乘法中的倒数。(???)
乘法逆元:群G中任意一个元素a,都在G中有唯一的逆元a‘,具有性质aa’=a’a=e,其中e为群的单位元。(!!!)

咳咳,是不是觉得最后两个很高深?其实第二个不用管,你只需要知道第3个,你可以这样理解:
有一个数a,一个模数M,当

gcd(a,M)=1(就是a,M互质) g c d ( a , M ) = 1 ( 就 是 a , M 互 质 )

gcd(a,M)=1\quad(就是a,M互质)满足时有

ab≡1(modM) a b ≡ 1 ( m o d M )

ab≡1(mod\quad M)此时b称为a的乘法逆元,同时此时a也为b的乘法逆元.又可以说此时a,b互为乘法逆元.
那么此时我们就可以表示出:

a≡b−1≡1b(modM) a ≡ b − 1 ≡ 1 b ( m o d M )

a≡b^{-1}≡\frac1b(mod\quad M)
可以简单、宽泛地甚至有点错误地理解为 分数可以参加同余运算?
是不是思路清晰了很多(然并卵…)好吧,我们来举个例子:
当a=4,M=7时,此时4,7互质,那我们凑一凑就可以凑出: 4*2≡1(mod 7),呀!一组乘法逆元就出现了!此时4,2就互为乘法逆元.(hhh…)再来俩例子:

当a=5,M=8时,此时5,8互质,那我们凑一凑又可以凑出: 5*5≡1(mod 8),呀!一组乘法逆元又出现了!此时5,5就互为乘法逆元.

当a=10,M=3时,此时10,3互质,那我们凑一凑又可以凑出: 10*1≡1(mod 3),呀!一组乘法逆元又出现了!此时10,1就互为乘法逆元.

我们可以发现,在同一M下当gcd(a,M)=1时可能有许多b满足ab≡1(mod M)比如第一个例子 4*2≡1(mod 7),同时4*9≡1(mod 7),4*16≡1(mod 7),说明同一a可能与多个b互为乘法逆元.
好吧,现在对乘法逆元大概了解一丢丢了吧?
补充一下,这里的b我们又可以记作inv(a)

费马小定理

至于怎么证明的,呵呵,作者并不知道,貌似是跟剩余系有关,有兴趣的盆友们自己查查吧,它的内容是:
假如p是质数,且

gcd(a,p)=1 g c d ( a , p ) = 1

gcd(a,p)=1那么

ap≡a(modp) a p ≡ a ( m o d p )

a^p≡a(mod\quad p)

ap−1≡1(modp) a p − 1 ≡ 1 ( m o d p )

a^{p-1}≡1(mod\quad p)
好吧,我们来试一试:
当a=8,p=3时gcd(8,3)=1,所以8^2≡1(mod 3)
当a=5,p=2时gcd(5,2)=1,所以5^1≡1(mod 2)
当a=4,p=5时gcd(4,9)=1,所以4^4≡1(mod 5)
…我们就默认它是对的吧…

乘法逆元(编程计算)

那么,今天最重要的来了
当有a,M满足gcd(a,M)=1,我们根据费马小定理可以得到:

aM−1≡1(modM) a M − 1 ≡ 1 ( m o d M )

a^{M-1}≡1(mod\quad M)
那么变一下形:

a∗aM−2≡1(modM) a ∗ a M − 2 ≡ 1 ( m o d M )

a*a^{M-2}≡1(mod\quad M)
这个东西是不是满足上面的乘法逆元定义?
所以,此时 a与a^(M-2)互为乘法逆元
那么

aM−2≡a−1≡1a(modM) a M − 2 ≡ a − 1 ≡ 1 a ( m o d M )

a^{M-2}≡a^{-1}≡\frac1a(mod\quad M)
我们有知道模运算有乘法结合律

ba≡b∗a−1≡b∗aM−2(modM) b a ≡ b ∗ a − 1 ≡ b ∗ a M − 2 ( m o d M )

\frac ba≡b*a^{-1}≡b*a^{M-2}(mod\quad M)
这说明, 如果当分数形如b/a(a!=0且为整数)参加模运算时,且gcd(a,M)=1,那么b/a就同余b*a^(M-2)
一个分数转化成了整数,神不神奇??
所以, 在gcd(a,M)=1时,除以a等价于乘a的乘法逆元

有关乘法逆元题目

(AtCoder - 1974)いろはちゃんとマス目 / Iroha and a Grid(乘法逆元+组合计数)

这是我的另一篇博客….题目大意和跟乘法逆元没有关系的部分(是关于计数方面问题)先在里面看了吧(好吧,我这个可爱的人在刷阅读量)
…………………………………..
好了,相信你已经看到了这道题组合计数长这个样子:

(∑i=b+1WC(H−a+i−2,i−1)∗C(W+a−i−1,a−1))%MOD ( ∑ i = b + 1 W C ( H − a + i − 2 , i − 1 ) ∗ C ( W + a − i − 1 , a − 1 ) ) % M O D

(\sum_{i=b+1}^{W}C(H-a+i-2,i-1)*C(W+a-i-1,a-1))\%MO D
什么,你看不懂?那这种你看得懂了吧?

for(int i=b+1;i<=w;i++)//推导计数方法ans=(ans+C(h-a+i-2,i-1)*C(a+w-i-1,a-1)%MOD)%MOD;

好了,最重要的问题来了,C(m,n)怎么算??
我们知道,当m,n很小时,我们可以直接硬算.But,这里H,W都是100000级别的数,这样做肯定会TLE的,于是我们就要预处理:
我们知道C(m,n)是这样算的:

C(m,n)=m!n!(m−n)! C ( m , n ) = m ! n ! ( m − n ) !

C(m,n)= \frac{m!}{n!(m-n)!}
看到没有?阶乘!于是我们可以把阶乘s[i]都给,把组合上半部分预处理出来:

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

这里为什么是2*MAXN?你看看我们的计数式子就知道了
问题是组合下半部分怎么搞??我们知道,模运算中遇到除法是不能直接除的,因为有模数MOD但我们是不是可以变形成这样?

C(m,n)=(m!1n!(m−n)!)%MOD C ( m , n ) = ( m ! 1 n ! ( m − n ) ! ) % M O D

C(m,n)=(m! \frac{1}{n!(m-n)!})\%MOD
这里MOD是10^9+7,套路质数,所以满足之前所讲的乘法逆元,直接变形成:

C(m,n)=(m!(n!)MOD−2(m−n)!MOD−2)%MOD C ( m , n ) = ( m ! ( n ! ) M O D − 2 ( m − n ) ! M O D − 2 ) % M O D

C(m,n)=(m!(n!)^{MOD-2}(m-n)!^{MOD-2})\%MOD
我们就可以把最大的一个inv[i]和最小的inv[0]预处理出来,当然,可以加一个快速幂:

LL QuPow(LL x,LL y){//快速幂LL ret=1;while(y){if(y&1) ret=ret*x%MOD;x=x*x%MOD;y>>=1;}return ret;
}
    inv[0]=1;inv[2*MAXN]=QuPow(s[2*MAXN],MOD-2);

好了,那么其实你知道了除以最大s[i]怎么转换,就能知道剩下的所有:

1si+1≡invi+1≡1si∗(i+1)(modMOD) 1 s i + 1 ≡ i n v i + 1 ≡ 1 s i ∗ ( i + 1 ) ( m o d M O D )

\frac{1}{s_{i+1}}≡inv_{i+1}≡\frac{1}{s_i*(i+1)}(mod MOD)
你把最右边的(i+1)乘到第二个上面不就变成了s[i]的乘法逆元?
所以:

1si≡(i+1)∗invi+1(modMOD) 1 s i ≡ ( i + 1 ) ∗ i n v i + 1 ( m o d M O D )

\frac{1}{s_i}≡(i+1)*inv_{i+1}(mod MOD)
那我们就可以写递推式了:

for(int i=2*MAXN-1;i>=1;i--)inv[i]=inv[i+1]*(i+1)%MOD;

好了,这处理完了算C(m,n)就简单了:

LL C(LL m,LL n){//计算排列return s[m]*inv[n]%MOD*inv[m-n]%MOD;
}

是不是很神奇?
牢记一句话:在gcd(a,M)=1时,除以a等价于乘a的乘法逆元
代码自己跳回去看吧,顺便点个赞我是最喜欢的~~~
(AtCoder - 1974)いろはちゃんとマス目 / Iroha and a Grid(乘法逆元+组合计数)

乘法逆元(编程计算)+两道版题相关推荐

  1. 大数求乘法逆元c语言,乘法逆元(编程计算)+两道版题

    前言 看到这里的小盆友们千万不要以为这个东西很难,其实就是个1+1->1(1个定义+1个定理->1坨乘法逆元).Let's begin.web 有关乘法逆元定义 这个咱们就不要玩笑了,来, ...

  2. 【蓝桥杯】每日四道填空题(两道真题+两道模拟题)| 第三天

    专栏: 蓝桥杯--每日四道填空题(两道真题+两道模拟题) &离蓝桥杯已经不到一个月时间了,赶快刷起来吧,填空题一定别丢分!! ୧꒰•̀ᴗ•́꒱୨ 另一个专栏是: 蓝桥杯--编程题刷题营(每日四 ...

  3. BAT七年经验,却抵不过外企面试的两道算法题?

    整理| 琥珀 出品| AI科技大本营 又遇年底跳槽季,如果你曾在 BAT 等互联网大厂有过较为丰富的工作经验,想要换份工作,面试时会主要考虑哪些因素? 面试外企,却被两道算法题难住? 近日,一位网友在 ...

  4. BAT 七年经验,却抵不过外企面试的两道算法题?

    整理| 琥珀 出品| AI科技大本营 又遇年底跳槽季,如果你曾在 BAT 等互联网大厂有过较为丰富的工作经验,想要换份工作,面试时会主要考虑哪些因素? 面试外企,却被两道算法题难住? 近日,一位网友在 ...

  5. 【算法】两道算法题根据提供字母解决解码方法和城市的天际线天际线问题

    算法目录 解码方法 Java解答参考: 天际线问题 Java解答参考: 大家好,我是小冷. 上一篇了解了项目相关的知识点 接下来看下两道算法题吧,用Java解答,可能更能激发一下大脑思考. 解码方法 ...

  6. 两道概率题-供大家周末把玩

    两道概率题-供大家周末把玩 题目 1.给定一个函数rand5(),该函数能等概率生成1-5之间的整数(包括1和5),如何用该函数等概率生成整数1-7? 解法 本以为很简单,做了以后才发现其实并不简单, ...

  7. 2016恒生电子秋招笔试两道算法题

    2016恒生电子笔试两道算法题 1.求出1到100之间所有素数,要求时间复杂度最优. 我的最优解决方案是吧素数一个个放入一个素数数组里面(初始吧2放进去),后面的数只要判断是否能够整除这个素数数组里面 ...

  8. 2014年阿里巴巴校园招聘两道算法题

    昨天阿里巴巴校园招聘在线测试,总的来说算法题比较简单,至于前面的选择题不是本人的强项,个人感觉比较难.下面我们说说两道算法题: 第一题大意是有一个quary和text要求找出两者匹配最长的字符串的长度 ...

  9. 这两道大厂题,让我偶然发现百度的小彩蛋

    点击上方"程序员黑叔",选择"置顶或者星标" 你的关注意义重大! 文/黑叔 阅读本文需要 3分钟 前言 最近,好像面试文满天飞,瞄了一眼后,动不动就手写各类函数 ...

  10. 【递归】两道程序题理解递归

    递归的定义 在定义一个过程或者函数时,出现直接或间接调用自己的部分,称为递归.直接调用自己称为直接递归,间接调用自己称为间接递归. 第一题 编写一个递归函数计算最大公约数.使用该函数编程计算键盘输入两 ...

最新文章

  1. mysql的模糊查询以及时间类型整理
  2. Oracle之to_char(值,'fm99990.00')
  3. SpringBoot+Dubbo集成ELK实战
  4. eDiary电子日记本
  5. linux man 后面的数字,man命令后面的数字
  6. python scrapy框架基如何实现多线程_Python多线程爬图Scrapy框架爬图
  7. 蚂蚁金服自研数据库打败Oracle拿下世界第一;三星手机全面退出中国;微软发布Windows 10X双屏系统 | 极客头条...
  8. 2. 线性表的顺序结构
  9. 论文笔记:Deep neural networks for YouTube recommendations
  10. 模拟退火算法及MATLAB代码
  11. 超级记忆/图像数字记忆 110位数字图像转换表 0-9
  12. 北大计算机专业毕业论文,北京大学计算机专业硕士
  13. TBC声望 恢复萨满 炼金 宏 附魔300-375
  14. 详解节省计划,一文了解最云原生的成本优化方式
  15. 1218:取石子游戏(swap)
  16. 深入分析分布式系统中互斥性与幂等性问题
  17. mobl中title颜色的设置
  18. 两个人轮流抛硬币,正面获胜,先抛的人获胜的概率
  19. 卡拉兹(Callatz)猜想(以VS2017为例)
  20. Android Studio、Git 解决合并冲突

热门文章

  1. 道元实业彩盒包装工艺助推3C产业智能升级
  2. 自动化测试---Appium+python
  3. 什么样的代码是好代码?
  4. FPGA设计中遇到的奇葩问题之“芯片也要看出身” 1
  5. Amazon Drive服务即将关闭
  6. Verilog 语法知识3
  7. (分配问题)你让工人为你工作7天,给工人的回报是一根金条。金条平分成相连的7段,你必须在每天结束时给他们一段金条, 如果只许你两次把金条弄断,你如何给你的工人付费?
  8. S32K14x OpenSDA 无法烧录问题解决方法
  9. 液晶电视配屏相关问题解决方法
  10. 防火墙开启及白名单开启