BZOJ1257 [CQOI2007]余数之和sum

Vj做不出的蒟蒻转战BC,然后被虐哭了。。。只做出了1001。。。还能不能愉快的玩耍了T_T

算了算了,还是好好写我的题解吧。。。

这道题貌似很难,后来看了CLJ的题解发现是我太弱了。

对于k % i = k - (k div i) * i,

有性质:k % i最多sqrt(n)个,而且相同的余数一定相邻,于是二分出每个余数有几个即可。

 1 /**************************************************************
 2     Problem: 1257
 3     User: rausen
 4     Language: Pascal
 5     Result: Accepted
 6     Time:32 ms
 7     Memory:224 kb
 8 ****************************************************************/
 9  
10 var
11   n, k, ans, i, l, r : int64;
12  
13 begin
14   readln(n, k);
15   i := k div n;
16   l := k div (i + 1) + 1;
17   r := n;
18   while (l > 0) do begin
19     inc(ans, k * (r - l + 1) - i * (l + r) * (r - l + 1) >> 1);
20     if l = 1 then break;
21     i := k div (l - 1);
22     l := k div (i + 1) + 1;
23     r := k div i;
24   end;
25   writeln(ans);
26 end.
View Code

(p.s. 不知为何c++就是WA,于是改用Pascal写。。。)

By Xs酱~ 转载请说明 博客地址:http://www.cnblogs.com/rausen
原文地址:https://www.cnblogs.com/rausen/p/4007488.html