题解:P15566 [COCI 2025/2026 #5] 重量 / Težina
如果题解有问题,请私信我,我会在讨论区更正。
本题前置知识点:整除分块。
如果你已经会了整除分块,请跳过下面的内容。
整除分块
引一个例子来理解:
如下有一道例题,请你用编程实现:
给你一个整数
如果在
拿
发现了吗,在后大半段时结果大都为
接下来我们来看怎么做这道题。
这道题让我们求:
那么我们最外面的求和符号(即 for 循环实现,对于里面一层,不就和我们刚才说的例题完全一致吗?
时间复杂度
::::success[AC代码]
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e8;
int a[100001];
signed main() {
int n, k, ans = 0;
cin >> n >> k;
for(int i = 1; i <= n; i++) {
cin >> a[i];
}
for(int i = 1; i <= n; i++) {
int x = a[i] + 2;
int t = 1;
while(t <= k && t <= a[i]) {
int l = a[i] / t;
int r = min(k, a[i] / l);
ans += min(N, l * x) * (r - t + 1);
t = r + 1;
}
}
cout << ans;
return 0;
}
::::