結果
問題 |
No.2449 square_permutation
|
ユーザー |
![]() |
提出日時 | 2023-03-04 19:35:14 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 147 ms / 2,000 ms |
コード長 | 1,085 bytes |
コンパイル時間 | 1,962 ms |
コンパイル使用メモリ | 201,704 KB |
最終ジャッジ日時 | 2025-02-11 05:22:00 |
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 21 |
ソースコード
#include <bits/stdc++.h> using namespace std; const int MAX_N = 5e5; int can_div[MAX_N] = {}; struct init_prime { init_prime() { can_div[1] = -1; for (int i = 2; i < MAX_N; i++) { if (can_div[i] != 0) continue; for (int j = i + i; j < MAX_N; j += i) can_div[j] = i; } } } init_prime; inline bool is_prime(int n) { if (n <= 1) return false; return !can_div[n]; } void factorization(int n, unordered_map<int, int> &res) { if (n <= 1) return; if (!can_div[n]) { ++res[n]; return; } ++res[can_div[n]]; factorization(n / can_div[n], res); } int main() { int n; cin >> n; vector<int> odd(n + 1); vector<vector<int>> v(n + 1); for (int i = 1; i <= n; i++) { unordered_map<int, int> F; factorization(i, F); int q = 1; for (auto [p, e] : F) { if (e & 1) q *= p; } odd[i] = q; v[q].push_back(i); } vector<int> ans(n); for (int i = 1; i <= n; i++) { ans[i - 1] = v[odd[i]].back(); v[odd[i]].pop_back(); } for (int i = 0; i < n; i++) cout << ans[i] << (i + 1 == n ? "\n" : " "); }