題目描述
給定n,p,k ,其中p 是質數。
求∑ni=11i(modpk)
題目保證答案是PQ 的形式,且Q−1 ,即Q 對pk 的逆元存在。
npk≤1018
p≤105
分析
先考慮所有變量的範圍
k≤70
n≤1018
類似於求n!modp 的思路。
∑ni=11i=1p∑⌊np⌋i=11i+∑0<a<p,a+bp≤n1a+bp
那麼這個式子的計算就分成了兩個部分。
part 1
1p∑⌊np⌋i=11i(modpk)
假如我們可以處理好1p 的問題,那麼剩下的遞歸計算就可以了。
考慮計算
∑⌊np⌋i=11i(modpk+1)
那麼由於題目保證了答案逆元存在,所以
1p∑⌊np⌋i=11i=∑⌊np⌋i=11imodpk+1p(modpk)
分子必定含有p 的因子,具體證明的話,
a=b(modc)⇔ap=bp(modcp)
結合這個式子倒推一下就可以得到了。
part 2
∑0<a<p,a+bp≤n1a+bp
現在要處理的就是快速地計算∑(a+bp)−1
考慮按a 分組,推導
原式=∑⌊n−ap⌋b=01a+bp=∑⌊n−ap⌋b=011+bpaa(modpk)
考慮11−x=x0+x1+x2+⋯
那麼
原式=∑⌊n−ap⌋b=0∑+∞k=0(−bpa)ka=∑⌊n−ap⌋b=0∑+∞i=0(−bpa)ia(modpk)
由於括號內那項含p ,因此當i≥k 時,和式裏面的項就爲0 了。
考慮交換枚舉順序,則有
原式=∑k−1i=0(−pa)i∑⌊n−ap⌋b=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
}