_bzoj1257 [CQOI2007]余数之和sum【小技巧】
2024-09-30 09:40:37
传送门: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;
}
最新文章
- C#图片处理常见方法性能比较
- Debian7下初次尝试Nginx+Uwsgi部署Django开发环境
- C# Susan边缘检测(Susan Edge Detection)
- 新萝卜家园GHOST WIN7系统32,64位极速装机特别版
- NET下RabbitMQ实践[实战篇]
- analytics.js
- MySQL忘记了密码登录不进去,用命令符修改新的密码重新登录的方法
- 为什么Underscore
- SQL语句优化(转摘)
- CSS小tip整理
- nginx取结构体地址
- mysql经典面试题
- celery定时任务
- elementUI 设置input的只读或禁用
- Python -处理PDF
- python之旅六【第七篇】面向对象
- C和C++相互调用
- springboot项目文件上传(绝对路径)并使用tomcat虚拟路径进行图片预览
- gdb 调试(查看运行时数据) 四
- ASP.Net Core 2.2 MVC入门到基本使用系列 (四)