結果
問題 | No.2496 LCM between Permutations |
ユーザー |
👑 ![]() |
提出日時 | 2023-10-06 22:57:13 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 98 ms / 2,000 ms |
コード長 | 2,854 bytes |
コンパイル時間 | 2,845 ms |
コンパイル使用メモリ | 252,032 KB |
実行使用メモリ | 25,476 KB |
平均クエリ数 | 774.14 |
最終ジャッジ日時 | 2024-07-26 16:51:00 |
合計ジャッジ時間 | 5,681 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 28 |
ソースコード
#include <bits/stdc++.h>using namespace std;#define FOR(i,m,n) for(int i=(m);i<(n);++i)#define REP(i,n) FOR(i,0,n)using ll = long long;constexpr int INF = 0x3f3f3f3f;constexpr long long LINF = 0x3f3f3f3f3f3f3f3fLL;constexpr double EPS = 1e-8;constexpr int MOD = 998244353;// constexpr int MOD = 1000000007;constexpr int DY4[]{1, 0, -1, 0}, DX4[]{0, -1, 0, 1};constexpr int DY8[]{1, 1, 0, -1, -1, -1, 0, 1};constexpr int DX8[]{0, -1, -1, -1, 0, 1, 1, 1};template <typename T, typename U>inline bool chmax(T& a, U b) { return a < b ? (a = b, true) : false; }template <typename T, typename U>inline bool chmin(T& a, U b) { return a > b ? (a = b, true) : false; }struct IOSetup {IOSetup() {std::cin.tie(nullptr);std::ios_base::sync_with_stdio(false);std::cout << fixed << setprecision(20);}} iosetup;template <bool GETS_ONLY_PRIME>std::vector<int> prime_sieve(const int n) {std::vector<int> smallest_prime_factor(n + 1), prime;std::iota(smallest_prime_factor.begin(), smallest_prime_factor.end(), 0);for (int i = 2; i <= n; ++i) {if (smallest_prime_factor[i] == i) [[unlikely]] prime.emplace_back(i);for (const int p : prime) {if (i * p > n || p > smallest_prime_factor[i]) break;smallest_prime_factor[i * p] = p;}}return GETS_ONLY_PRIME ? prime : smallest_prime_factor;}int query(const int i, const int j) {cout << "? " << i + 1 << ' ' << j + 1 << endl;int x; cin >> x;return x;}void output(const vector<int>& a, const vector<int>& b) {cout << '!';for (const int a_i : a) cout << ' ' << a_i;for (const int b_i : b) cout << ' ' << b_i;cout << endl;}int main() {int n; cin >> n;if (n == 1) {cout << "! 1 1" << endl;return 0;}const int p = prime_sieve<true>(n).back();vector<int> a(n, -1), b(n, -1);int index = 0;if (query(0, 0) % p == 0) {if (query(0, 1) % p == 0) {REP(i, n) b[i] = query(0, i) / p;vector<int> b1;REP(i, n) {if (b[i] == 1) b1.emplace_back(i);}assert(b1.size() == 2);if (query(1, b1.back()) % p == 0) {b[b1.back()] = p;b1.pop_back();} else {b[b1.front()] = p;b1.erase(b1.begin());}a[0] = p;FOR(i, 1, n) a[i] = query(i, b1.back());output(a, b);return 0;}} else {++index;while (index < n - 1 && query(0, index) % p > 0) ++index;}REP(i, n) a[i] = query(i, index) / p;vector<int> a1;REP(i, n) {if (a[i] == 1) a1.emplace_back(i);}assert(a1.size() == 2);if (query(a1.back(), index == 0 ? 1 : 0) % p == 0) {a[a1.back()] = p;a1.pop_back();} else {a[a1.front()] = p;a1.erase(a1.begin());}b[index] = p;REP(i, n) {if (b[i] == -1) b[i] = query(a1.back(), i);}output(a, b);return 0;}