求逆元可以用費馬小定理或者擴充套件歐幾里得,也可以用如下的o(n)演算法:(背下來)
這個對p是有要求的,p(也就是模數)必須是質數
p不是質數的話,就用擴充套件歐幾里得比較方便了(兩個數有逆元當且僅當互質!)
inv[1]=1;
for(i=2;i<=p;i++)
inv[i]=(p-p/i)*inv[p%i]%p
也可以用另乙個o(n)的方法
經過一堆證明:
先用快速冪費馬小定理求出b[n](b[n]=inv[n!],而n!可以用線性來做。注意模p哦。複雜度是o(log(n)),與後來的o(n)一加就可以刪去前者了!)
因為inv[n]*b[n-1]=b[n]
又因為b[n-1]*(n-1)!=1
所以方程左右兩邊同時乘以(n-1)!,得
inv[n]=b[n]*a[n-1]*************(a[n]=n!,o(n)可得該陣列)
完美。0w0。
我也不知道這樣可以幹嘛,我想想。。。我大概聽了一節假的數論。
補充一下怎麼利用b[n]把b陣列也給求出來吧~
b[n-1]*inv[n]=b[n]
同理,我們在方程的左右兩邊同時乘以n,得:
b[n-1]=b[n]*n
qwq再來一次o[n],真完美呀真完美,b[ ]陣列也求出來了。
人類的本質就是復讀機。那麼知道這些(a[ ],b[ ],inv[ ],當然是在模p意義下),至少可以拎過來求組合數:——rxz
c(n,m)=a[n]%p*b[m]%p*b[n-m]%p。
這樣就可以o(2*n+log(n))預處理,o(1)輸出。
快到飛起!麻麻再也不用擔心我超時啦!
線性求逆元
在某些組合數的計數問題中,經常會用到逆元,這裡我們講一下如何線性求出1到n在模p意義下的逆元,注意p為質數。假設我們當前要求a在模p意義下的逆元。令p ak r,0 rp a k r,0 r 那麼 ak r 0 modp a k r 0 modp 然後恒等式變形,兩邊同時乘a 1 r 1 a 1 r...
線性求逆元及其過程
連續兩天考了求逆元。所以想著寫一篇關於線性求逆元的部落格。inv 1 1 for int i 2 i n i inv i mod long long mod i inv mod i mod 我們要求i在模p意義下的逆元inv i 那麼我們就設ki r p,所以ki r移項可以得到 r 兩邊同時除以i...
線性求逆元及其過程
連續兩天考了求逆元。所以想著寫一篇關於線性求逆元的部落格。inv 1 1 for int i 2 i n i inv i mod long long mod i inv mod i mod 我們要求i在模p意義下的逆元inv i 那麼我們就設ki r p,所以ki r0 mod p 移項可以得到 r...