大数求乘法逆元c语言,乘法逆元(编程计算)+两道版题
前言
看到這里的小盆友們千萬(wàn)不要以為這個(gè)東西很難,其實(shí)就是個(gè)1+1->1(1個(gè)定義+1個(gè)定理->1坨乘法逆元).Let’s begin.web
有關(guān)乘法逆元定義
這個(gè)咱們就不要玩笑了,來(lái),直接看定義:
乘法:是指將相同的數(shù)加起來(lái)的快捷方式。(呵呵呵)
逆元素:指一個(gè)能夠取消另外一給定元素運(yùn)算的元素,在數(shù)學(xué)里,逆元素廣義化了加法中的加法逆元和乘法中的倒數(shù)。(???)
乘法逆元:群G中任意一個(gè)元素a,都在G中有惟一的逆元a‘,具備性質(zhì)aa’=a’a=e,其中e為群的單位元。(!!!)編程
咳咳,是否是以為最后兩個(gè)很高深?其實(shí)第二個(gè)不用管,你只須要知道第3個(gè),你能夠這樣理解:
有一個(gè)數(shù)a,一個(gè)模數(shù)M,當(dāng)svg
gcd(a,M)=1(就是a,M互質(zhì))g
c
d
(
a
,
M
)
=
1
(
就
是
a
,
M
互
質(zhì)
)
知足時(shí)有
ab≡1(modM)a
b
≡
1
(
m
o
d
M
)
此時(shí)b稱為a的乘法逆元,同時(shí)此時(shí)a也為b的乘法逆元.又能夠說(shuō)此時(shí)a,b互為乘法逆元.
那么此時(shí)咱們就能夠表示出:
a≡b?1≡1b(modM)a
≡
b
?
1
≡
1
b
(
m
o
d
M
)
能夠簡(jiǎn)單、寬泛地甚至有點(diǎn)錯(cuò)誤地理解為
分?jǐn)?shù)能夠參加同余運(yùn)算?
是否是思路清晰了不少(然并卵…)好吧,咱們來(lái)舉個(gè)例子:
當(dāng)a=4,M=7時(shí),此時(shí)4,7互質(zhì),那咱們湊一湊就能夠湊出: 4*2≡1(mod 7),呀!一組乘法逆元就出現(xiàn)了!此時(shí)4,2就互為乘法逆元.(hhh…)再來(lái)倆例子:
當(dāng)a=5,M=8時(shí),此時(shí)5,8互質(zhì),那咱們湊一湊又能夠湊出: 5*5≡1(mod 8),呀!一組乘法逆元又出現(xiàn)了!此時(shí)5,5就互為乘法逆元.atom
當(dāng)a=10,M=3時(shí),此時(shí)10,3互質(zhì),那咱們湊一湊又能夠湊出: 10*1≡1(mod 3),呀!一組乘法逆元又出現(xiàn)了!此時(shí)10,1就互為乘法逆元.spa
咱們能夠發(fā)現(xiàn),在同一M下當(dāng)gcd(a,M)=1時(shí)可能有許多b知足ab≡1(mod M)好比第一個(gè)例子 4*2≡1(mod 7),同時(shí)4*9≡1(mod 7),4*16≡1(mod 7),說(shuō)明同一a可能與多個(gè)b互為乘法逆元.
好吧,如今對(duì)乘法逆元大概了解一丟丟了吧?
補(bǔ)充一下,這里的b咱們又能夠記做inv(a).net
費(fèi)馬小定理
至于怎么證實(shí)的,呵呵,做者并不知道,貌似是跟剩余系有關(guān),有興趣的盆友們本身查查吧,它的內(nèi)容是:
假如p是質(zhì)數(shù),且code
gcd(a,p)=1g
c
d
(
a
,
p
)
=
1
那么
ap≡a(modp)a
p
≡
a
(
m
o
d
p
)
ap?1≡1(modp)a
p
?
1
≡
1
(
m
o
d
p
)
好吧,咱們來(lái)試一試:
當(dāng)a=8,p=3時(shí)gcd(8,3)=1,因此8^2≡1(mod 3)
當(dāng)a=5,p=2時(shí)gcd(5,2)=1,因此5^1≡1(mod 2)
當(dāng)a=4,p=5時(shí)gcd(4,9)=1,因此4^4≡1(mod 5)
…咱們就默認(rèn)它是對(duì)的吧…
乘法逆元(編程計(jì)算)
那么,今天最重要的來(lái)了
當(dāng)有a,M知足gcd(a,M)=1,咱們根據(jù)費(fèi)馬小定理能夠獲得:
orm
aM?1≡1(modM)a
M
?
1
≡
1
(
m
o
d
M
)
那么變一下形:
a?aM?2≡1(modM)a
?
a
M
?
2
≡
1
(
m
o
d
M
)
這個(gè)東西是否是知足上面的乘法逆元定義?
因此,此時(shí)
a與a^(M-2)互為乘法逆元
那么
aM?2≡a?1≡1a(modM)a
M
?
2
≡
a
?
1
≡
1
a
(
m
o
d
M
)
咱們有知道模運(yùn)算有乘法結(jié)合律
ba≡b?a?1≡b?aM?2(modM)b
a
≡
b
?
a
?
1
≡
b
?
a
M
?
2
(
m
o
d
M
)
這說(shuō)明,
若是當(dāng)分?jǐn)?shù)形如b/a(a!=0且為整數(shù))參加模運(yùn)算時(shí),且gcd(a,M)=1,那么b/a就同余b*a^(M-2)
一個(gè)分?jǐn)?shù)轉(zhuǎn)化成了整數(shù),神不神奇??
因此,
在gcd(a,M)=1時(shí),除以a等價(jià)于乘a的乘法逆元
有關(guān)乘法逆元題目
這是個(gè)人另外一篇博客….題目大意和跟乘法逆元沒(méi)有關(guān)系的部分(是關(guān)于計(jì)數(shù)方面問(wèn)題)先在里面看了吧(好吧,我這個(gè)可愛(ài)的人在刷閱讀量)
…………………………………..
好了,相信你已經(jīng)看到了這道題組合計(jì)數(shù)長(zhǎng)這個(gè)樣子:
xml
(∑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
什么,你看不懂?那這種你看得懂了吧?
for(int i=b+1;i<=w;i++)//推導(dǎo)計(jì)數(shù)方法
ans=(ans+C(h-a+i-2,i-1)*C(a+w-i-1,a-1)%MOD)%MOD;
好了,最重要的問(wèn)題來(lái)了,C(m,n)怎么算??
咱們知道,當(dāng)m,n很小時(shí),咱們能夠直接硬算.But,這里H,W都是100000級(jí)別的數(shù),這樣作確定會(huì)TLE的,因而咱們就要預(yù)處理:
咱們知道C(m,n)是這樣算的:
blog
C(m,n)=m!n!(m?n)!C
(
m
,
n
)
=
m
!
n
!
(
m
?
n
)
!
看到?jīng)]有?階乘!因而咱們能夠把階乘s[i]都給,把組合上半部分預(yù)處理出來(lái):
for(int i=1;i<=2*MAXN;i++) s[i]=s[i-1]*i%MOD;
這里為何是2*MAXN?你看看咱們的計(jì)數(shù)式子就知道了
問(wèn)題是組合下半部分怎么搞??咱們知道,模運(yùn)算中遇到除法是不能直接除的,由于有模數(shù)MOD但咱們是否是能夠變?cè)斐蛇@樣?
C(m,n)=(m!1n!(m?n)!)%MODC
(
m
,
n
)
=
(
m
!
1
n
!
(
m
?
n
)
!
)
%
M
O
D
這里MOD是10^9+7,套路質(zhì)數(shù),因此知足以前所講的乘法逆元,直接變?cè)斐?#xff1a;
C(m,n)=(m!(n!)MOD?2(m?n)!MOD?2)%MODC
(
m
,
n
)
=
(
m
!
(
n
!
)
M
O
D
?
2
(
m
?
n
)
!
M
O
D
?
2
)
%
M
O
D
咱們就能夠把最大的一個(gè)inv[i]和最小的inv[0]預(yù)處理出來(lái),固然,能夠加一個(gè)快速冪:
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);
好了,那么其實(shí)你知道了除以最大s[i]怎么轉(zhuǎn)換,就能知道剩下的全部:
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
)
你把最右邊的(i+1)乘到第二個(gè)上面不就變成了s[i]的乘法逆元?
因此:
1si≡(i+1)?invi+1(modMOD)1
s
i
≡
(
i
+
1
)
?
i
n
v
i
+
1
(
m
o
d
M
O
D
)
那咱們就能夠?qū)戇f推式了:
for(int i=2*MAXN-1;i>=1;i--)
inv[i]=inv[i+1]*(i+1)%MOD;
好了,這處理完了算C(m,n)就簡(jiǎn)單了:
LL C(LL m,LL n){//計(jì)算排列
return s[m]*inv[n]%MOD*inv[m-n]%MOD;
}
是否是很神奇?
牢記一句話:在gcd(a,M)=1時(shí),除以a等價(jià)于乘a的乘法逆元
代碼本身跳回去看吧,順便點(diǎn)個(gè)贊我是最喜歡的~~~
(AtCoder - 1974)いろはちゃんとマス目 / Iroha and a Grid(乘法逆元+組合計(jì)數(shù))
總結(jié)
以上是生活随笔為你收集整理的大数求乘法逆元c语言,乘法逆元(编程计算)+两道版题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: ubuntu运行android stud
- 下一篇: 3步即可完成在线压缩gif文件大小