結果
問題 | No.2045 Two Reflections |
ユーザー |
![]() |
提出日時 | 2022-08-19 22:22:04 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 1,481 bytes |
コンパイル時間 | 1,964 ms |
コンパイル使用メモリ | 180,088 KB |
実行使用メモリ | 6,816 KB |
最終ジャッジ日時 | 2024-10-08 09:15:55 |
合計ジャッジ時間 | 3,101 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 23 WA * 4 |
ソースコード
#include <bits/stdc++.h>int ri() {int n;scanf("%d", &n);return n;}int main() {int n = ri();int p = ri();int q = ri();std::vector<int> next(2 * n);for (int i = 0; i < 2 * n; i++) {int cur_next = i % n;if (i < n && cur_next < p) cur_next = p - 1 - cur_next;if (i >= n && cur_next >= n - q) cur_next = n - 1 - (q - 1 - (n - 1 - cur_next));if (i < n) cur_next += n;next[i] = cur_next;}std::map<int, int> factors;std::vector<int> len(2 * n, -1);bool half = true;for (int i = 0; i < 2 * n; i++) if (len[i] == -1) {int cur = i;std::vector<int> path;do {path.push_back(cur);cur = next[cur];} while (cur != i);for (auto i : path) len[i] = path.size();if (len[i] % 2 == 0) {int h = path.size() / 2;for (int i = 0; i < h; i++) if (path[i] % n != path[i + h] % n) half = false;}// std::cerr << len[i] << std::endl;int m = path.size();for (int i = 2; i * i <= m; i++) {int cnt = 0;while (m % i == 0) cnt++, m /= i;factors[i] = std::max(factors[i], cnt);}if (m > 1) factors[m] = std::max(factors[m], 1);}// std::cerr << half << std::endl;int res = 1;for (auto i : factors) {for (int j = 0; j < i.second; j++) res = (int64_t) res * i.first % 998244353;}if (half) {if (res & 1) res = (res + 998244353) / 2;else res /= 2;}if (!factors[2]) {res++;if (res & 1) res = (res + 998244353) / 2;else res /= 2;}std::cout << res << std::endl;return 0;}