【GDKOI2016】小學生數學題(附帶了乘法取模黑科技)

題目描述

給定n,p,k ,其中p 是質數。
ni=11i(modpk)
題目保證答案是PQ 的形式,且Q1 ,即Qpk 的逆元存在。

npk1018
p105


分析

先考慮所有變量的範圍
k70
n1018

類似於求n!modp 的思路。

ni=11i=1pnpi=11i+0<a<p,a+bpn1a+bp

那麼這個式子的計算就分成了兩個部分。

part 1

1pnpi=11i(modpk)

假如我們可以處理好1p 的問題,那麼剩下的遞歸計算就可以了。
考慮計算

npi=11i(modpk+1)

那麼由於題目保證了答案逆元存在,所以

1pnpi=11i=npi=11imodpk+1p(modpk)

分子必定含有p 的因子,具體證明的話,

a=b(modc)ap=bp(modcp)

結合這個式子倒推一下就可以得到了。

part 2

0<a<p,a+bpn1a+bp

現在要處理的就是快速地計算(a+bp)1
考慮按a 分組,推導

=napb=01a+bp=napb=011+bpaa(modpk)

考慮11x=x0+x1+x2+
那麼

=napb=0+k=0(bpa)ka=napb=0+i=0(bpa)ia(modpk)

由於括號內那項含p ,因此當ik 時,和式裏面的項就爲0 了。
考慮交換枚舉順序,則有

=k1i=0(pa)inapb=0bia(modpk)

問題成功地轉化成了自然數冪求和問題,用矩陣乘法處理一下就可以了。

考慮時間複雜度。

T(n,k)=T(np,k+1)+k3+kP

因此總的時間複雜度上界約爲O(k3lognp+kPlognp)


備註

注意中間可能要有64位整數相乘後取模的過程。
用黑科技就可以跑得飛快了。

附一下黑科技的代碼

LL mult( LL A, LL B, LL Mo )
{
    LL temp = ( ( LL ) ( ( db ) A*B/Mo+1e-6 ) * Mo );
    return A*B - temp;
}
發佈了114 篇原創文章 · 獲贊 4 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章