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;
}
posted @ 2024-11-11 18:51  MrPython  阅读(7)  评论(0)    收藏  举报  来源