Alice's Adventures in Permuting
怎么搞的,为什么好多大佬都在这里爆炸了?
对于 ,其最终效果一定是将所有不小于 的数变成在 到 中没有出现的数。应用乌姆·尼克算法二分找到有多少个数小于 ,剩下的数都要操作各一遍。
需要稍微处理一下:
- 时,初始数组内的所有数都大于等于 ,需要各操作一遍,共 次。
- 时,第 到 个数分别修改为 到 ,第 项本身为 无需修改,共 次;
- 时,第 到 个数分别修改为 到 ,第 项被修改为 ,第 项已经为 不变,共 次;
- 时,我们会一直重复操作那个最大的元素,永远无法到达答案,无解。
#include <algorithm>
#include <iostream>
#include <ranges>
using namespace std;
istream& fin = cin;
ostream& fout = cout;
using ui = unsigned int;
using uli = unsigned long long int;
using li = long long int;
using ulli = __uint128_t;
int main(void) {
ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
size_t T;
fin >> T;
while (T--) {
uli n, b, c;
fin >> n >> b >> c;
if (b == 0) {
if (c + 2 < n)
fout << "-1\n";
else
fout << (c == n - 2 ? n - 1 : c == n - 1 ? n - 1 : n) << '\n';
continue;
}
auto view =
ranges::views::iota(0ull, n) |
ranges::views::transform([b, c](uli x) { return (ulli)b * x + c; });
fout << (n - uli(ranges::lower_bound(view, n) - view.begin())) << '\n';
}
return 0;
}