_bzoj1257 [CQOI2007]余数之和sum【小技巧】
2017-02-10 19:53
218 查看
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1257
最近刚做了一道莫比乌斯的题,需要用到这种方法。
应该让k / i相等的一连串k % i相加,举个例子:
100 / 34 = 2 ... 32
100 / 35 = 2 ... 30
100 / 36 = 2 ... 28
...
100 / 50 = 2 ... 0
可以观察到,商相同的余数数列是公差为商的相反数的等差数列,用求和公式就可以O(1)计算。
那么程序该怎么写呢?注意,如果当前的除数是i,那么[i, n / (n / i)]这个区间所有的数作为除数时,商都相同,那么之后就简单了。
#include <cstdio> #include <algorithm> int n, k; long long ans; int main(void) { scanf("%d%d", &n, &k); int last, lmt = std::min(n, k), d; long long tem; if (n > k) { ans = (long long)k * (n - k); } for (int i = 1; i <= lmt; i = last + 1) { d = k / i; last = std::min(k / d, lmt); tem = last - i + 1; ans += tem * (k % i) - ((tem * (tem - 1)) >> 1) * d; } printf("%lld\n", ans); return 0; }
相关文章推荐
- 四元数运动学笔记(3)四元数和旋转相关的约定表述
- POJ - 3984 迷宫问题
- 更改eclipse中SVN账号
- 第四章:向量
- tp5 url 线上访问 在nginx 上 出现404错误,解决办法(1.80nginx 配置 pathInfo)
- 四元数运动学笔记(2)旋转向量,旋转矩阵和四元数的关系
- 寒假阅读笔记十四
- HDU 1233 还是畅通工程
- PAT A1072 Gas Station(30)
- 2月14日情人节即将来临,储君为大家找到了“程序员聊没女朋友的四大神坑”,辛苦奋斗的猿们不要再次入坑
- 1051. Pop Sequence (25)
- java多维数组
- mysql 日期加减简单的计算
- 关于矩阵乘法按照列乘行的方式来看
- poj 1185 炮兵阵地 【状态压缩dp】
- php及codeigniter使用session-cookie
- C实例---写入文件
- javascript面向对象实现方法(类的继承与多态)
- 拉格朗日乘数法
- NOIp2012疫情控制