1 条题解
-
1
Part 1
先来模拟一下样例第 组数据,答案为 :
再来模拟一下样例第 组数据,答案为 :
Part 2
不难发现,当 时, 便不再变化了。
证明:
若 ,则:
$$s_i = \dfrac{i \times s_i + s_i}{i+1} > \dfrac{i \times s_i}{i+1}>\dfrac{i \times s_i+s_i-i-1}{i+1}=s_i-1 $$故 不再变化。
Part 3
此外,当这个时刻到来时,。
证明:
等价于 。设 ,,,则 ,,, 等价于 ;
当 增加 (即设 )时,;
显然:
$$\lceil \dfrac{h_{j-1}}{j} \rceil \times j-\dfrac{h_{i}}{j} \times j<j $$故 $d(j)-d(i)=[f(j)-g(j)]-[f(i)-g(i)]=[f(j)-f(i)]-[g(j)-g(i)]\le (j-1)-(2j-1)=-j$,即 。
也就是说,当 增加到 时, 函数的值至少减小 ;
当 时,$d(i)=a-1-2-3-\ldots-\sqrt{2a}=a-\dfrac{(1+\sqrt{2a})\times \sqrt{2a}}{2}=-\sqrt{\dfrac{a}{2}}<0$,显然这个时刻已经到来。
Part 4
于是,我们暴力计算 ,剩下的是等差数列,套公式就行了。
最终的时间复杂度为 ,空间复杂度为 。
Part 5
std:
#include <bits/stdc++.h> using namespace std; int main() { int T; cin >> T; while (T--) { long long n, a, i; cin >> n >> a; long long w = a; for (i = 2; i <= n; i++) { if (a % i) a += (i - a % i); w += a; if (a / i <= i) break; } if (i < n) w += (n - i) * (a / i * (i + 1) + a / i * n) / 2; cout << w << endl; } return 0; }
- 1
信息
- ID
- 11
- 时间
- 3000ms
- 内存
- 512MiB
- 难度
- 5
- 标签
- (无)
- 递交数
- 1
- 已通过
- 1
- 上传者