【WinterCamp 2013】模积和

2019-04-13 16:55发布

Description

i=1nj=1,jim(nmodi)(mmodj)
n,m<=10^9,答案模19940417

Solution

首先,看到有%,心里很不爽,把它变成nnii,对于ij的情况,后面减去就可以了。我们设n<m
于是原式就变成了
i=1nj=1m(nnii)(mmjj)i=1n(nnii)(mmii)
再设f(n)=i=1nnnii
于是原式就变成了f(n)f(m)i=1n(nnii)(mmii)
考虑分成两部分计算

Part 1

f(n)=i=1nnnii
=n2i=1nnii
发现ni最多只有n种取值,于是我们可以使用分块。(分块大法好!)
l为一段连续的ni相等的左端点,那么这个区间的右端点r便满足nr>=nl,并且为最大值。移项得r=nnl。那就可以利用高斯求和搞出来了。

Part 2

i=1n(nni