補了一道cf題,順便看到有人求逆元的方法叼叼的,怪不得人家過題這麼快啊……
來總結一發……
求a關於n的逆元,即要解同餘方程ax
≡1(modn)
的解x. ax
≡1(modn)
⇔ax+
ny=1
僅當a與n互質時,存在
a 的逆元,利用擴充套件歐幾里得求解。
這裡n不一定是素數
ll extend_euclid(ll a, ll b, ll &x, ll &y)
ll r = extend_euclid(b, a%b, y, x);
y -= a/b*x;
return r;
}
x = (x % n + n) % n
當n是素數,有ap
−1≡1
(modp)
,則a−1
=ap−
2%p
當p比較大時,需要快速冪求解。非遞迴的寫法是墜好的。
#define ll long long
ll poo(ll a, int k, int
m) return res;
}
當n是質數,a是
(n+1
)的約數
時,a−
1=n+
1a這點也很好理解。當n是質數,0 < a < n時,(a
,n)=
1 ,則a肯定存在逆元。
而解出的n+
1a就滿足n+
1a⋅a
≡1(modn)
,故它是a的逆元。
在cf 696c,n=
1000000007時
2−1=
1000000007+1
2=500000004 3
−1=1000000007+1
3=333333336
求解就灰常方便了…
如果是求好多數的逆元,還是打個表比較方便,只要o(n)。
當n是大素數,求小於n的數的逆元。
設這個數是i,
令p=i
t+k,
其中t=
i/n,
k=i%
n 則i
t≡−k
(modp)
且i2t
2≡k2
(modp)
令i的逆元是i
−1,有兩種方法求i−
1 :i−
1≡−t
⋅k−1
≡(p−
t)k−
1%p i−
1≡it
2(k−
1)2%
p
都是通過先求k−
1 來求i−
1 ,兩者結果都是一樣的,別忘模p即可。注意:計算過程中可能會爆long long
。
int rev[n];
void get_rev()
}
暫時只用到了這幾種求逆元辦法,若還有新的繼續更… 求逆元的四種辦法
2018 03 17 12 06 26 還有乙個半小時就開始天梯賽排位賽了 乙個小時 看看求逆元吧 在補zoj2018三月賽c題的時候遇到的 之前遇見數學題基本上都是選擇性略過的 感謝四種辦法 例如 a b p 總結一下求逆元的適用情況 是否要求a b互質 是否要求p為質數 資料多大的時候可以用 時...
數論 逆元 O(n)求逆元
傳送門 這是乙個學長的部落格,但是看了好幾遍都沒記住,所以決定自己寫一下。所謂o n 求逆元就是遞推,下面是證明 inv i mod mod i inv mod i 證明 設 t mod i,k mod i 則 t i k 0 mod mod 移項得到 t i k mod mod 兩邊同除i k,即...
線性求逆元
在某些組合數的計數問題中,經常會用到逆元,這裡我們講一下如何線性求出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...