这题算是个数论题。
其实也没用到什么数论结论,首先手算找找规律。发现,对于 有 为常数,于是这一区间内的数就可以只算一次,然后将结果乘以区间内整数的个数就行了。但当时,每个区间的长度,这样就得不偿失了,所以当时每个区间处理一次,当时,进行朴素的计算。
div 运算就这样解决了,剩下的取余可以由整除的结果生成,对于,有,每个区间内,为定值,所以令,则对于区间,有。同样地,当时,进行朴素的计算。
时间复杂度 ,空间复杂度 O(1)。
算法就是这样了,刚开始写的时候 TLE 了,原因是作为循环条件的 sqrt(n) 没有提前计算出来,于是导致了很多不必要的运算,多么低级的错误……
C++ 代码在这里。
P.S. 突然想做编号是大家生日的题目,这题编号是我一个朋友的生日,自己的生日编号的题目的状态是暂不提供……
Tags:algorithm,C++,OI,Vijos
Related Posts
[OI][Vijos 1107]环游大同 80 天 (2)
[OI][Vijos 1059]积木城堡 (0)
NOIP2007 完结 (11)
clock() in C++ (0)
看看我的计算机 (1)