题目描述
给定
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