专栏文章
P2261 [CQOI2007] 余数求和
P2261题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @miqagcre
- 此快照首次捕获于
- 2025/12/04 01:36 3 个月前
- 此快照最后确认于
- 2025/12/04 01:36 3 个月前
CPP
//这题数据范围大,采用整数分块,最多有根号n个块,不会超时。
//因为 a % b == a * n - 求和 i * [k / i](下取整)
#include <iostream>
#define int long long
using namespace std;
const int N = 1e9 + 5;
int n,k,r,ans;//记得开long long
signed main(){
cin >> n >> k;
for (int l = 1;l <= n;l = r + 1){ //l,表示区间左端点,r,表示区间右端点,因为每次计算的是一个块的总长度,所以每次都要跳到右端点加1,跳到第二个块
if (k / l == 0) r = n;//如果说后面块的长度不够了,右端点就为n
else r = min (k / (k / l) , n);//否则的话,就让右端点在块长和n之间取个小的
ans += (r - l + 1) * (k / l) * (l + r) / 2;//(r - l + 1)为块长,(k / l)表示公式的变化,(l + r) / 2表示平均值
}
cout << n * k - ans << '\n';//套公式
return 0;//华丽结束
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...