[CQOI2007]余数之和sum Bzoj1257
首先考虑所有n>k的部分:k mod n=k,答案直接+k*(n-k)。
接下来考虑n属于区间[1,ceil(sqrt(k))]的情况。因为sqrt(k)只有5位数而已,可以按照题目要求朴素算一遍。
最后考虑n属于区间[ceil(sqrt(k)),k]的情况:因为k mod n=k-k div n*n,此时k div n最大为ceil(sqrt(k)),最小为1。如果我们知道某个k div n=a,那么我们就可以求出n的取值范围(因为n在这个范围内都满足k div n=a):[k/n]=a等价于k>=an && k<(a+1)n。换句话来说k/(a+1) < n <= k/a。
得到n的取值区间[L,R]后,这部分k mod n的和就是Σ[i=L->R,(k-ai)]。
我们枚举所有的a,并累加各个部分的余数和,这就是答案。总的复杂度为O(sqrt(k))。 Read on →