admin 管理员组文章数量: 887007
乘法逆元(编程计算)+两道版题
- 前言
- 有关乘法逆元定义
- 费马小定理
- 乘法逆元(编程计算)
- 有关乘法逆元题目
- (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,当
那么此时我们就可以表示出:
a≡b−1≡1b(modM) a ≡ b − 1 ≡ 1 b ( m o d 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是质数,且
好吧,我们来试一试:
当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,我们根据费马小定理可以得到:
那么变一下形:
a∗aM−2≡1(modM) a ∗ a M − 2 ≡ 1 ( m o d M )
这个东西是不是满足上面的乘法逆元定义?
所以,此时 a与a^(M-2)互为乘法逆元
那么
aM−2≡a−1≡1a(modM) a M − 2 ≡ a − 1 ≡ 1 a ( m o d M )
我们有知道模运算有乘法结合律
ba≡b∗a−1≡b∗aM−2(modM) b a ≡ b ∗ a − 1 ≡ b ∗ a M − 2 ( m o d 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(乘法逆元+组合计数)
这是我的另一篇博客….题目大意和跟乘法逆元没有关系的部分(是关于计数方面问题)先在里面看了吧(好吧,我这个可爱的人在刷阅读量)
…………………………………..
好了,相信你已经看到了这道题组合计数长这个样子:
什么,你看不懂?那这种你看得懂了吧?
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)是这样算的:
看到没有?阶乘!于是我们可以把阶乘s[i]都给,把组合上半部分预处理出来:
for(int i=1;i<=2*MAXN;i++) s[i]=s[i-1]*i%MOD;
这里为什么是2*MAXN?你看看我们的计数式子就知道了
问题是组合下半部分怎么搞??我们知道,模运算中遇到除法是不能直接除的,因为有模数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
我们就可以把最大的一个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]怎么转换,就能知道剩下的所有:
你把最右边的(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 )
那我们就可以写递推式了:
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(乘法逆元+组合计数)
本文标签: 乘法逆元(编程计算)两道版题
版权声明:本文标题:乘法逆元(编程计算)+两道版题 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1732354067h1533931.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论