學習筆記 省選演算法 數論 BSGS演算法

2021-08-15 18:53:30 字數 3156 閱讀 9666

(浙江省神犇協會)

神犇1號:zjoi 2018的題大家都ak了嗎?

全體神犇:ak了!

神犇1號:7號神犇,你認識那個弱弱的xyz32768嗎?

神犇7號:是的,我認識!我現在就去d他!

(x省y市)

神犇7號:告訴你,zj的神犇協會從此有乙個規矩:第1天,協會派我,也就是7號神犇來d人,第2天,協會就派49號神犇來d人,第3天,就派343號神犇來d人,以此類推。我們這裡的神犇人數為109

+6109+

6,所以,如果是第

n n

天, 就派7

nmod(10

9+7)

' role="presentation" style="position: relative;">7

nmod(10

9+7)

7nmod(109

+7)號神犇來d人。

我們這裡最鉅的神犇是

168812736

168812736

號,就考考你:最少在第幾天,這號神犇會來d你?

xyz32768:難道,乙個乙個列舉

n n

? 神犇7號:如果想不出來的話,我馬上去叫168812736號神犇出來!

xyz32768:我還真的不會什麼高階的數論演算法。

神犇7號:168812736號神犇,在浙江嗎?我又d了乙個弱雞!

神犇168812736號:切,bsgs這麼水的演算法,我們協會裡每乙個人都會,就你不會,辣雞!

xyz32768:bsgs?北上廣深?拔山蓋世?

神犇7號&神犇168812736號:哈,菜!

開頭中zj神犇7號提出的問題就是乙個經典模型: 給定a

,b,c

' role="presentation" style="position: relative;">a,b

,ca,

b,c(

c c

是質數),求滿足 ax

≡b(modc)

' role="presentation" style="text-align: center; position: relative;">ax≡

b(modc)a

x≡b(

modc

)的最小正整數

x x

。 如果暴力求解的話,複雜度是o(

c)' role="presentation" style="position: relative;">o(c

)o(c

)的,不足以通過神犇7號給出的109

+7109+

7的模數。而bsgs演算法可以實現o(

c−−√

) o(c

)的複雜度。

bsgs(baby step giant step),即先小步後大步。

根據費馬小定理,有ac

−1≡1

(modc)

a c−

1≡1(

modc

)。所以,ax

a

x的值滿足週期性變化,且存在乙個週期為x∈

[1,c

) x∈[

1,c)

。 (1)先取s=

⌈c−−

√⌉s =⌈

c⌉

。 (2)把

a a

,a2' role="presentation" style="position: relative;">a2a

2,a3

a

3,a4

a

4,…,as

a s模

c c

的值存入雜湊表。

(3)按順序

i' role="presentation" style="position: relative;">ii從

0 0

到s−1' role="presentation" style="position: relative;">s−1

s−1,考慮是否存在

j j

使得ai

×s+j

≡b(modc)

' role="presentation" style="position: relative;">ai×

s+j≡

b(modc)a

i×s+

j≡b(

modc)。

上式中1≤j

≤s1 ≤j

≤s

。把ai

×s+j

a i×

s+

j拆解成ai

×s×a

j ai×

s×aj

。 將式子移項: aj

≡b×(

ai×s

)−1(

modc

) aj≡

b×(a

i×s)

−1

(modc)

其中−1

1是乘法逆元。

這時候可以先算出b×

(ai×

s)−1

modc

b ×(

ai×s

)−

1mod

c的值,

然後在雜湊表中查詢是否有這個值,如果存在合法的,最小的j j

, 則答案x=

i×s+

j' role="presentation" style="position: relative;">x=i

×s+j

x=i×

s+j。

如果cc

不是質數,那麼ai

×s' role="presentation" style="position: relative;">ai×

sai×

s可能不存在逆元。

這時候就需要轉化,使得逆元存在。

蒟蒻xyz32768不會,只好放**了:

int bsgs() 

int dalao = qpow(x, c - 2, c), tmp = b;

for (i = 0; i < s; ++i)

tmp = 1ll * tmp * dalao % c;

}ha.clear(); return -1;

}

學習筆記 BSGS 演算法

bsgs baby step giant step 即大步小步演算法,常用於求解離散對數問題。該演算法可以在 o sqrt p 的時間複雜度內求解 a x equiv b pmod p 我們將求解的答案 x 設為 km c c m 的形式,即 a equiv b pmod p 在 a perp p ...

學習筆記 省選演算法 莫隊

神犇mx 你是 來的弱菜?你是不是上次noip爆0的那個大弱雞xyz32768?xyz32768 我就是那個noip2017寫炸兩題的蒟蒻,的確是大弱雞。神犇mx 我還聽說你連莫隊都不會 你恐怕明年noip連400都沒有了。xyz32768 莫 莫隊?神犇mx 就是這樣 乙個 n n 個數的序列,每...

學習筆記 省選演算法 高斯消元Gauss

n n 個節點m role presentation style position relative m m條邊的無向連通圖,每到乙個節點就會等概率隨機地選擇下乙個與當前的點有邊相連的節點走,求從 1 1 走到n role presentation style position relative n...