专栏文章
数论分块
算法·理论参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mip249kj
- 此快照首次捕获于
- 2025/12/03 04:55 3 个月前
- 此快照最后确认于
- 2025/12/03 04:55 3 个月前
一类问题
有一类问题,要求你求:
这样的东西。 的范围往往很大(),要用低于线性的复杂度。
思路
一般而言,这种东西的性质就是:虽然 很大,但是很多的数都是相同的:
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | |
|---|---|---|---|---|---|---|---|---|---|---|
| 10 | 5 | 3 | 2 | 2 | 1 | 1 | 1 | 1 | 1 |
所以我们没必要把每个 都求出来。
考虑会有多少种可能的 的取值:

在 以后, 的导数小于 ,因此 的变化速度要低于 ,因此 都是可能的取值。
在 以前,一共只有 种可能的取值,而由于导数大于 , 所对应的 都不同。
因此,变化次数为 。
那么,怎么求出每种取值的区间呢?
假设一种取值对应的区间为 ,则:
所以:
THE END
(又补完一篇博客)
Code
CPP#include <iostream>
using namespace std;
using ll = long long;
int main() {
ll n, k;
cin >> n >> k;
ll l, r;
ll ans = n * k;
for (l = 1; l <= n; l = r + 1) {
if (k / l) r = min(k / (k / l), n);
else r = n;
ans -= (r - l + 1) * (k / l) * (l + r) / 2;
}
cout << ans << endl;
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...