注意(不)到有这样一个结论:
:::info结论 对于任意一组满足题目给出条件的等式 ,都必然存在正整数 满足 。
构造 即可满足条件。 :::
固定 的值,对当前的 枚举所有可能取到的 的值(容易证明需要枚举的 的数量均摊不超过 )。此时考虑快速判定对当前确定的 ,是否可以找到一组 满足上述的所有条件,列出不等关系后可以发现需要同时满足下列条件:
- ()
前两个条件可以直接贪心的在候选集合中找出最小的满足 的 ,最后一个限制维护指针 表示当前 的取值范围即可。候选集合可以拿 set 或者别的 ds 维护,时间复杂度是 的。
int buc[N];
vector<int> divs_[N];
inline void sol() {
int n, m, l, r; cin >> n >> m >> l >> r;
for (int i = 1; i <= max(n, m); ++i)
for (int j = i; j <= max(n, m); j += i) divs_[j].emplace_back(i);
int pl = m + 1, pr = m;
set<int> se;
for (int i = 1; i <= n; ++i) {
while (pl > (l - 1) / i + 1) {
--pl;
for (int &j : divs_[pl]) if (!buc[j]++) se.emplace(j);
} while (pr > r / i) {
for (int &j : divs_[pr]) if (!--buc[j]) se.erase(j);
--pr;
} for (int &j : divs_[i]) {
auto it = se.upper_bound(j);
if (it != se.end() && i / j * *it <= n) {
cout << i << ' ' << pr / *it * *it << ' ' << i / j * *it << ' ' << pr / *it * j << '\n';
goto label;
}
} cout << -1 << '\n'; label:;
}
}
喜欢的话,留下你的评论吧~