题目描述
给定N,K,P,求
(∑Ni=11i)modPK
若答案不存在则输出-1
数据范围
N∗PK≤1018
P≤105
P为质数
题解
这道题的确是道不错的数学题。
设
那么我们将1,2,⋯n分为两类:
1. P的倍数,设为集合
2. 其他,设为集合T
那么很显然,集合
我们考虑怎么计算
很显然的,
但我们这样无法计算1p。
考虑一个事实:
若amodp=c,那么(k∗a)mod(k∗p)=(k∗c)
因此,我们可以考虑计算
然后
当然,这里有一个细节,就是假如f(⌊np⌋,k+1)不是P的倍数,那么
并且可以发现这样递归下去,n∗pk的值不变,所以pk永远不大于1018,但n变为了
那么我们就相当于可以递归到一个子问题求解了。
接下来考虑集合T的贡献。
先假设
那么集合T的数都是这样的形式
所以
但这样还是计不了啊。
让我们考虑一下怎么计1a+i∗P
我们有以下式子:
并且根据等比数列求和,当存在某个i,满足
那记a−1=x,我么有
又因为我们只需要计算modpk下的答案,那么
我们将这条式子代入到之前的式子中,可以得到
我们交换一下枚举顺序,可以发现:
由于保证了n∗pk≤1018,且p≤105,我们就可以直接枚举a,b,可以发现,对于后面的式子就是一个自然数幂和问题。并且式子与a无关,所以可以先用矩阵预处理出来。
那么计算
考虑总体的复杂度,设T(n,k)为计算f(n,k)的复杂度,那么有
T(n,k)=T(⌊nP⌋,k+1)+O(P∗k+k3)≈P∗k∗logN+k3logN
851





