题解:CF2045B ICPC Square
PrinceEvan · · 题解
设答案为
ans=s \times v \times p_k 然后
v 满足下面两个条件:
s \times p_k \times v \le n s \times p_k \times (v - 1) \le d 综合一下就有:
v \le \min(\lfloor \frac{n}{s \times p_k} \rfloor,\lfloor \frac{d}{s \times p_k} \rfloor + 1)
这接对这个式子整除分块就行了,这里再介绍个结论:
::::success[代码]
#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll n, d, s;
int main() {
cin >> n >> d >> s;
n /= s, d /= s;
ll p1 = 1, p2 = 1, ans = s;
while(p1 <= n && p2 <= d) {
ll r1 = n / (n / p1), r2 = d / (d / p2);
ll v = min(n / p1, d / p2 + 1);
ans = max(ans, s * min(r1, r2) * v);
if(r1 < r2) p1 = r1 + 1;
else p2 = r2 + 1;
}
cout << ans << "\n";
return 0;
}
::::