[题解] Codeforces Round 900(Div.3) E~F
Codeforces Round 900(Div.3) E~F
E. Iva & Pav
因为按位与的结果不会随着越多数字的增加而增加,因此我们可以利用这个性质二分出右端点,只需要一个可以查询区间的数据结构即可。
或者是按位考虑第
template <typename _Ty, typename _Oper> class SparseTable { private: std::vector<std::vector<_Ty>> _f; _Oper _oper; std::size_t _n; public: using value_type = _Ty; using operator_type = _Oper; private: explicit SparseTable(std::size_t n, _Ty value, _Oper oper) : _f(std::bit_width(n), std::vector<_Ty>(n, value)), _oper(std::move(oper)), _n(n) {} public: template <std::input_iterator __Iter, typename __Oper> requires requires(typename std::iterator_traits<__Iter>::value_type x, __Oper oper) { { oper(x, x) } -> std::same_as<typename std::iterator_traits<__Iter>::value_type>; } explicit SparseTable(__Iter first, __Iter last, __Oper oper) : SparseTable(std::distance(first, last), (typename __Iter::value_type){}, std::move(oper)) { std::copy(first, last, _f[0].begin()); for (std::size_t i = 1; i < _f.size(); i++) { for (std::size_t j = 0; j + (1 << i) - 1 < _n; j++) { _f[i][j] = _oper(_f[i - 1][j], _f[i - 1][j + (1 << (i - 1))]); } } } auto Ask(std::size_t l, std::size_t r) const -> _Ty { auto s = std::bit_width(r - l) - 1; return _oper(_f[s][l], _f[s][r - (1 << s)]); } auto Size() const noexcept -> std::size_t { return _n; } }; template <typename __Iter, typename __Oper> explicit SparseTable(__Iter, __Iter, __Oper) -> SparseTable<typename std::iterator_traits<__Iter>::value_type, __Oper>; void Main() { int n; std::cin >> n; std::vector<int> a(n); for (auto &x : a) { std::cin >> x; } SparseTable st(a.begin(), a.end(), std::bit_and{}); auto GetLast = [&](int first, int k) -> int { int l = first + 1, r = n, last = -1; while (l <= r) { auto mid = std::midpoint(l, r); if (st.Ask(first, mid) >= k) { last = mid; l = mid + 1; } else { r = mid - 1; } } return last; }; int q; std::cin >> q; for (int t = 0; t < q; t += 1) { int l, k; std::cin >> l >> k; l -= 1; std::cout << GetLast(l, k) << " \n"[t + 1 == q]; } }
F. Vasilije Loves Number Theory
由唯一分解定理,可得
因为
题目要问是否存在一个数
那么我们要怎么确定可以从求得的
最后一个问题:
我们发现,给定的
此时我们要知道
void Main() { int n, q; std::cin >> n >> q; auto Calc = [](auto &mp, auto n, auto d) { for (int i = 2; i * i <= n; i += 1) { if (n % i == 0) { int cnt = 0; while (n % i == 0) { n /= i; cnt += 1; } d /= mp[i] + 1; d *= (mp[i] += cnt) + 1; } } if (n > 1) { d /= mp[n] + 1; d *= (mp[n] += 1) + 1; } return d; }; std::map<int,int> pre; i64 pred = Calc(pre, n, i64(1)); auto mp = pre; auto d = pred; for (int t = 0; t < q; t += 1) { int opt; std::cin >> opt; if (opt == 1) { int x; std::cin >> x; d = Calc(mp, x, d); auto tmp = d; for (auto [x, y] : mp) { while (y > 0 && tmp % x == 0) { tmp /= x; y --; } } if (tmp == 1) { std::cout << "YES\n"; } else { std::cout << "NO\n"; } } else { mp = pre; d = pred; } } std::cout << '\n'; }
本文作者:フランドール·スカーレット
本文链接:https://www.cnblogs.com/FlandreScarlet/p/17734183.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步