結果
問題 |
No.3204 Permuted Integer
|
ユーザー |
|
提出日時 | 2025-07-18 21:39:21 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 25,435 bytes |
コンパイル時間 | 4,863 ms |
コンパイル使用メモリ | 305,784 KB |
実行使用メモリ | 8,140 KB |
最終ジャッジ日時 | 2025-07-18 21:39:57 |
合計ジャッジ時間 | 8,433 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 10 WA * 15 |
ソースコード
#include <bits/stdc++.h> using namespace std; using ll = long long; using vl = vector<ll>; using vvl = vector<vl>; using vvvl = vector<vvl>; using xy = pair<ll, ll>; using vxy = vector<xy>; using vvxy = vector<vxy>; using bs8 = bitset<8>; using bs16 = bitset<16>; using bs32 = bitset<32>; using bs64 = bitset<64>; using vbs8 = vector<bs8>; using vbs16 = vector<bs16>; using vbs32 = vector<bs32>; using vbs64 = vector<bs64>; using vs = vector<string>; using vvs = vector<vs>; using ull = unsigned long long; using vul = vector<ull>; using vd = vector<double>; using vvd = vector<vd>; using coord = pair<double, double>; using vcoord = vector<coord>; #define rep(var, n) for (ll var = 0; var < (n); var++) #define cnt(var, n, m) for (ll var = (n); var <= (m); var++) #define rcnt(var, n, m) for (ll var = (n); var >= (m); var--) #define each(ite, C) for (auto ite = (C).begin(); ite != (C).end(); ite++) #define reach(ite, C) for (auto ite = (C).rbegin(); ite != (C).rend(); ite++) #define yn(b) cout << (((b) > 0) ? "Yes" : "No") << endl; ///////////////////////////////////////////////// namespace zz_time { /// @brief プログラム実行時のタイムポイント std::chrono::_V2::system_clock::time_point START_TIME = std::chrono::system_clock::now(); /// @brief プログラム実行から経過時間をミリ秒で取得 /// @param st 経過開始時刻(基本引数指定する必要なし) /// @return 経過時間ミリ秒 ll currentTime(std::chrono::_V2::system_clock::time_point st = START_TIME) { std::chrono::_V2::system_clock::time_point now = std::chrono::system_clock::now(); return (ll)(std::chrono::duration_cast<std::chrono::milliseconds>(now - st) .count()); }; /// @brief 実行時間が超過していないかの判定 /// @param mSec 実行時間制約ミリ秒 /// @return 実行時間制約以下であればtrue,その他はfalse bool punctualityTime(const ll& mSec) { return (currentTime() < mSec); } /// @brief 実行時間が超過しているかの判定 /// @param mSec 実行時間制約ミリ秒 /// @return 実行時間制約超過していればtrue,その他はfalse bool spendTime(const ll& mSec) { return (currentTime() >= mSec); } }; // namespace zz_time using namespace zz_time; namespace zz_random { random_device seed_gen; default_random_engine RANDOM_ENGINE(seed_gen()); /// @brief 整数閉区間[L,R]一様ランダム器生成 /// @param L 下限値 (default 0) /// @param R 上限値 (default 1) /// @return ランダム生成器, RAMDOM_ENGINEを引数としてランダム生成 uniform_int_distribution<> createIntCloseSegRandom(const ll& L = 0, const ll& R = 1) { return uniform_int_distribution<>(L, R); }; /// @brief 実数閉区間[L,R]一様ランダム器生成 /// @param L 下限値 (default 0.0) /// @param R 上限値 (default 1.0) /// @return ランダム生成器, RAMDOM_ENGINEを引数としてランダム生成 uniform_real_distribution<> createRealCloseSegRandom(const double& L = 0.0, const double& R = 1.0) { return uniform_real_distribution<>(L, R); }; /// @brief 正規表現ランダム器生成 /// @param average 平均値 /// @param s 標準偏差 /// @return ランダム生成器, RAMDOM_ENGINEを引数としてランダム生成 normal_distribution<> createNormalRandom(const double& average = 0.0, const double& s = 1.0) { return normal_distribution<>(average, s); }; }; // namespace zz_random using namespace zz_random; namespace zz_mod { class pp { public: ll val; ll mod; void recalc() { val %= mod; if (val < 0) val += mod; }; /// @brief modint (+-*/ != exp ~ inv recalc ) /// @param x value /// @param y mod (default= 998244353) pp(const ll& x = 0, const ll& y = 998244353) { val = x; mod = y; recalc(); }; friend pp operator+(const pp& x, const pp& y) { return pp(x.val + y.val, x.mod); }; friend pp operator+(const pp&& x, const pp& y) { return pp(x.val + y.val, x.mod); }; friend pp operator+(const pp& x, const pp&& y) { return pp(x.val + y.val, x.mod); }; friend pp operator+(const pp&& x, const pp&& y) { return pp(x.val + y.val, x.mod); }; template <typename T> friend pp operator+(const pp& x, const T& y) { return pp(x.val + y, x.mod); }; template <typename T> friend pp operator+(const pp&& x, const T& y) { return pp(x.val + y, x.mod); }; template <typename T> friend pp operator+(const pp& x, const T&& y) { return pp(x.val + y, x.mod); }; template <typename T> friend pp operator+(const pp&& x, const T&& y) { return pp(x.val + y, x.mod); }; friend pp operator-(const pp& x) { return pp(-x.val, x.mod); }; friend pp operator-(const pp&& x) { return pp(-x.val, x.mod); }; friend pp operator-(const pp& x, const pp& y) { return pp(x.val - y.val, x.mod); }; friend pp operator-(const pp&& x, const pp& y) { return pp(x.val - y.val, x.mod); }; friend pp operator-(const pp& x, const pp&& y) { return pp(x.val - y.val, x.mod); }; friend pp operator-(const pp&& x, const pp&& y) { return pp(x.val - y.val, x.mod); }; template <typename T> friend pp operator-(const pp& x, const T& y) { return pp(x.val - y, x.mod); }; template <typename T> friend pp operator-(const pp&& x, const T& y) { return pp(x.val - y, x.mod); }; template <typename T> friend pp operator-(const pp& x, const T&& y) { return pp(x.val - y, x.mod); }; template <typename T> friend pp operator-(const pp&& x, const T&& y) { return pp(x.val - y, x.mod); }; friend pp operator*(const pp& x, const pp& y) { return pp(x.val * y.val, x.mod); }; friend pp operator*(const pp&& x, const pp& y) { return pp(x.val * y.val, x.mod); }; friend pp operator*(const pp& x, const pp&& y) { return pp(x.val * y.val, x.mod); }; friend pp operator*(const pp&& x, const pp&& y) { return pp(x.val * y.val, x.mod); }; template <typename T> friend pp operator*(const pp& x, const T& y) { return pp(x.val * y, x.mod); }; template <typename T> friend pp operator*(const pp&& x, const T& y) { return pp(x.val * y, x.mod); }; template <typename T> friend pp operator*(const pp& x, const T&& y) { return pp(x.val * y, x.mod); }; template <typename T> friend pp operator*(const pp&& x, const T&& y) { return pp(x.val * y, x.mod); }; friend pp operator~(const pp& x) { return x.exp(-1); } friend pp operator~(const pp&& x) { return x.exp(-1); } friend pp operator/(const pp& x, const pp& y) { return x * (~y); }; friend pp operator/(const pp&& x, const pp& y) { return x * (~y); }; friend pp operator/(const pp& x, const pp&& y) { return x * (~y); }; friend pp operator/(const pp&& x, const pp&& y) { return x * (~y); }; template <typename T> friend pp operator/(const pp& x, const T& y) { return x * pp(y, x.mod).inv(); }; template <typename T> friend pp operator/(const pp&& x, const T& y) { return x * pp(y, x.mod).inv(); }; template <typename T> friend pp operator/(const pp& x, const T&& y) { return x * pp(y, x.mod).inv(); }; template <typename T> friend pp operator/(const pp&& x, const T&& y) { return x * pp(y, x.mod).inv(); }; friend pp& operator+=(pp& x, const pp& y) { x.val += y.val; x.recalc(); return x; }; friend pp& operator+=(pp& x, const pp&& y) { x.val += y.val; x.recalc(); return x; }; template <typename T> friend pp& operator+=(pp& x, const T& y) { x.val += y; x.recalc(); return x; }; template <typename T> friend pp& operator+=(pp& x, const T&& y) { x.val += y; x.recalc(); return x; }; friend pp& operator-=(pp& x, const pp& y) { x.val -= y.val; x.recalc(); return x; }; friend pp& operator-=(pp& x, const pp&& y) { x.val -= y.val; x.recalc(); return x; }; template <typename T> friend pp& operator-=(pp& x, const T& y) { x.val -= y; x.recalc(); return x; }; template <typename T> friend pp& operator-=(pp& x, const T&& y) { x.val -= y; x.recalc(); return x; }; friend pp& operator*=(pp& x, const pp& y) { x.val *= y.val; x.recalc(); return x; }; friend pp& operator*=(pp& x, const pp&& y) { x.val *= y.val; x.recalc(); return x; }; template <typename T> friend pp& operator*=(pp& x, const T& y) { x.val *= y; x.recalc(); return x; }; template <typename T> friend pp& operator*=(pp& x, const T&& y) { x.val *= y; x.recalc(); return x; }; friend pp& operator/=(pp& x, const pp& y) { x *= pp(y.val, x.mod).inv(); x.recalc(); return x; }; friend pp& operator/=(pp& x, const pp&& y) { x *= pp(y.val, x.mod).inv(); x.recalc(); return x; }; template <typename T> friend pp& operator/=(pp& x, const T& y) { x *= pp(y, x.mod).inv(); x.recalc(); return x; }; template <typename T> friend pp& operator/=(pp& x, const T&& y) { x *= pp(y, x.mod).inv(); x.recalc(); return x; }; pp exp(ll x) const { if (x == 0) { return pp(1, this->mod); } pp y = *this; if (x > 0) { vl Vec; while (x > 0) { Vec.push_back(x & 1); x >>= 1; } pp ans(1, this->mod); each(ite, Vec) { if (*ite) ans = ans * y; y = y * y; } return ans; } return y.exp(y.mod - 2).exp(-x); }; pp inv() const { return ~(*this); return pp(this->val, this->mod).exp(-1); } }; class factorial { public: const ll size; vector<pp> vec; /// @brief mod! (operator[] comb) /// @param x max! [0,x] (default 1000000) /// @param y mod (default 998244353) factorial(const ll&& x = 1000000, const ll&& y = 998244353) : size(x + 1) { vec = vector<pp>(x + 1, pp(1, y)); cnt(i, 2, x) vec[i] *= (vec[i - 1] * pp(i, y)); }; /// @brief mod factorial /// @return x! mod pp operator[](const ll& x) const { return vec[x]; }; /// @brief mod factorial /// @return x! mod pp operator[](const ll&& x) const { return vec[x]; }; /// @brief mod combination /// @param n /// @param m /// @return nCm pp comb(const ll n, const ll m) const { return (vec[n] / (vec[m] * vec[n - m])); }; }; } // namespace zz_mod using namespace zz_mod; namespace zz_print { namespace elm { template <typename Arg> void ZOUT(const ll& FlatHier, const ll& Indent, const ll& Space, const Arg&& arg) { cout << "[" << arg << "| " << Indent << " " << Space << " ]" << endl; }; void ZOUT(const ll& FlatHier, const ll& Indent, const ll& Space, const ll& elm) { if (FlatHier > 0 && Indent > 0) cout << endl << string(Indent, ' '); cout << elm << string(Space, ' '); }; void ZOUT(const ll& FlatHier, const ll& Indent, const ll& Space, const int& elm) { if (FlatHier > 0 && Indent > 0) cout << endl << string(Indent, ' '); cout << elm << string(Space, ' '); }; void ZOUT(const ll& FlatHier, const ll& Indent, const ll& Space, const ull& elm) { if (FlatHier > 0 && Indent > 0) cout << endl << string(Indent, ' '); cout << elm << string(Space, ' '); }; void ZOUT(const ll& FlatHier, const ll& Indent, const ll& Space, const unsigned int& elm) { if (FlatHier > 0 && Indent > 0) cout << endl << string(Indent, ' '); cout << elm << string(Space, ' '); }; template <typename Elm1, typename Elm2> void ZOUT(const ll& FlatHier, const ll& Indent, const ll& Space, const pair<Elm1, Elm2>& pr) { if (FlatHier > 0 && Indent > 0) cout << endl << string(Indent, ' '); cout << "< " << pr.first << " , " << pr.second << " >" << string(Space, ' '); }; void ZOUT(const ll& FlatHier, const ll& Indent, const ll& Space, const pp& pr) { if (FlatHier > 0 && Indent > 0) cout << endl << string(Indent, ' '); cout << "{ " << pr.val << " | " << pr.mod << " }" << string(Space, ' '); }; void ZOUT(const ll& FlatHier, const ll& Indent, const ll& Space, const double& elm) { if (FlatHier > 0 && Indent > 0) cout << endl << string(Indent, ' '); cout << elm << string(Space, ' '); }; void ZOUT(const ll& FlatHier, const ll& Indent, const ll& Space, const float& elm) { if (FlatHier > 0 && Indent > 0) cout << endl << string(Indent, ' '); cout << elm << string(Space, ' '); }; void ZOUT(const ll& FlatHier, const ll& Indent, const ll& Space, const char& elm) { if (FlatHier > 0 && Indent > 0) cout << endl << string(Indent, ' '); cout << elm << string(Space, ' '); }; void ZOUT(const ll& FlatHier, const ll& Indent, const ll& Space, const string& elm) { if (FlatHier > 0 && Indent > 0) cout << endl << string(Indent, ' '); cout << elm << string(Space, ' '); }; void ZOUT(const ll& FlatHier, const ll& Indent, const ll& Space, const bs8& elm) { if (FlatHier > 0 && Indent > 0) cout << endl << string(Indent, ' '); cout << elm << string(Space, ' '); }; void ZOUT(const ll& FlatHier, const ll& Indent, const ll& Space, const bs16& elm) { if (FlatHier > 0 && Indent > 0) cout << endl << string(Indent, ' '); cout << elm << string(Space, ' '); }; void ZOUT(const ll& FlatHier, const ll& Indent, const ll& Space, const bs32& elm) { if (FlatHier > 0 && Indent > 0) cout << endl << string(Indent, ' '); cout << elm << string(Space, ' '); }; void ZOUT(const ll& FlatHier, const ll& Indent, const ll& Space, const bs64& elm) { if (FlatHier > 0 && Indent > 0) cout << endl << string(Indent, ' '); cout << elm << string(Space, ' '); }; template <typename Elm> void ZOUT(const ll& FlatHier, const ll& Indent, const ll& Space, const vector<Elm>& Vec) { if (FlatHier > 0 && Indent > 0) cout << endl << string(Indent, ' '); cout << "[" << string(Space, ' '); if (FlatHier == 1) cout << endl << string(Indent + (1 + Space), ' '); each(ite, Vec) ZOUT(max<ll>(0, FlatHier - 1), Indent + (FlatHier > 0 ? 3 : 0), Space, *ite); if (FlatHier >= 1) cout << endl << string(Indent, ' '); cout << "]" << string(Space, ' '); }; template <typename Elm> void ZOUT(const ll& FlatHier, const ll& Indent, const ll& Space, const list<Elm>& Lst) { if (FlatHier > 0 && Indent > 0) cout << endl << string(Indent, ' '); cout << "[" << string(Space, ' '); if (FlatHier == 1) cout << endl << string(Indent + (1 + Space), ' '); each(ite, Lst) ZOUT(max<ll>(0, FlatHier - 1), Indent + (FlatHier > 0 ? 3 : 0), Space, *ite); if (FlatHier >= 1) cout << endl << string(Indent, ' '); cout << "]" << string(Space, ' '); }; template <typename Elm> void ZOUT(const ll& FlatHier, const ll& Indent, const ll& Space, const set<Elm>& SET) { if (FlatHier > 0 && Indent > 0) cout << endl << string(Indent, ' '); cout << "[" << string(Space, ' '); if (FlatHier == 1) cout << endl << string(Indent + (1 + Space), ' '); each(ite, SET) ZOUT(max<ll>(0, FlatHier - 1), Indent + (FlatHier > 0 ? 3 : 0), Space, *ite); if (FlatHier >= 1) cout << endl << string(Indent, ' '); cout << "]" << string(Space, ' '); }; template <typename Elm> void ZOUT(const ll& FlatHier, const ll& Indent, const ll& Space, const multiset<Elm>& SET) { if (FlatHier > 0 && Indent > 0) cout << endl << string(Indent, ' '); cout << "[" << string(Space, ' '); if (FlatHier == 1) cout << endl << string(Indent + (1 + Space), ' '); each(ite, SET) ZOUT(max<ll>(0, FlatHier - 1), Indent + (FlatHier > 0 ? 3 : 0), Space, *ite); if (FlatHier >= 1) cout << endl << string(Indent, ' '); cout << "]" << string(Space, ' '); }; template <typename Elm> void ZOUT(const ll& FlatHier, const ll& Indent, const ll& Space, const unordered_set<Elm>& SET) { if (FlatHier > 0 && Indent > 0) cout << endl << string(Indent, ' '); cout << "[" << string(Space, ' '); if (FlatHier == 1) cout << endl << string(Indent + (1 + Space), ' '); each(ite, SET) ZOUT(max<ll>(0, FlatHier - 1), Indent + (FlatHier > 0 ? 3 : 0), Space, *ite); if (FlatHier >= 1) cout << endl << string(Indent, ' '); cout << "]" << string(Space, ' '); }; template <typename Elm> void ZOUT(const ll& FlatHier, const ll& Indent, const ll& Space, const unordered_multiset<Elm>& SET) { if (FlatHier > 0 && Indent > 0) cout << endl << string(Indent, ' '); cout << "[" << string(Space, ' '); if (FlatHier == 1) cout << endl << string(Indent + (1 + Space), ' '); each(ite, SET) ZOUT(max<ll>(0, FlatHier - 1), Indent + (FlatHier > 0 ? 3 : 0), Space, *ite); if (FlatHier >= 1) cout << endl << string(Indent, ' '); cout << "]" << string(Space, ' '); }; template <typename Elm1, typename Elm2> void ZOUT(const ll& FlatHier, const ll& Indent, const ll& Space, const map<Elm1, Elm2>& MAP) { if (FlatHier > 0 && Indent > 0) cout << endl << string(Indent, ' '); cout << "[" << string(Space, ' '); if (FlatHier == 1) cout << endl << string(Indent + (1 + Space), ' '); each(ite, MAP) ZOUT(max<ll>(0, FlatHier - 1), Indent + (FlatHier > 0 ? 3 : 0), Space, *ite); if (FlatHier >= 1) cout << endl << string(Indent, ' '); cout << "]" << string(Space, ' '); }; template <typename Elm1, typename Elm2> void ZOUT(const ll& FlatHier, const ll& Indent, const ll& Space, const multimap<Elm1, Elm2>& MAP) { if (FlatHier > 0 && Indent > 0) cout << endl << string(Indent, ' '); cout << "[" << string(Space, ' '); if (FlatHier == 1) cout << endl << string(Indent + (1 + Space), ' '); each(ite, MAP) ZOUT(max<ll>(0, FlatHier - 1), Indent + (FlatHier > 0 ? 3 : 0), Space, *ite); if (FlatHier >= 1) cout << endl << string(Indent, ' '); cout << "]" << string(Space, ' '); }; template <typename Elm1, typename Elm2> void ZOUT(const ll& FlatHier, const ll& Indent, const ll& Space, const unordered_map<Elm1, Elm2>& MAP) { if (FlatHier > 0 && Indent > 0) cout << endl << string(Indent, ' '); cout << "[" << string(Space, ' '); if (FlatHier == 1) cout << endl << string(Indent + (1 + Space), ' '); each(ite, MAP) ZOUT(max<ll>(0, FlatHier - 1), Indent + (FlatHier > 0 ? 3 : 0), Space, *ite); if (FlatHier >= 1) cout << endl << string(Indent, ' '); cout << "]" << string(Space, ' '); }; template <typename Elm1, typename Elm2> void ZOUT(const ll& FlatHier, const ll& Indent, const ll& Space, const unordered_multimap<Elm1, Elm2>& MAP) { if (FlatHier > 0 && Indent > 0) cout << endl << string(Indent, ' '); cout << "[" << string(Space, ' '); if (FlatHier == 1) cout << endl << string(Indent + (1 + Space), ' '); each(ite, MAP) ZOUT(max<ll>(0, FlatHier - 1), Indent + (FlatHier > 0 ? 3 : 0), Space, *ite); if (FlatHier >= 1) cout << endl << string(Indent, ' '); cout << "]" << string(Space, ' '); }; template <typename Elm> void ZOUT(const ll& FlatHier, const ll& Indent, const ll& Space, const stack<Elm>& Sta) { stack<Elm> Datas = Sta; if (FlatHier > 0 && Indent > 0) cout << endl << string(Indent, ' '); cout << "(" << string(Space, ' '); if (FlatHier == 1) cout << endl << string(Indent + (1 + Space), ' '); while (!Datas.empty()) { Elm Data = Datas.top(); Datas.pop(); ZOUT(max<ll>(0, FlatHier - 1), Indent + (FlatHier > 0 ? 3 : 0), Space, Data); } if (FlatHier >= 1) cout << endl << string(Indent, ' '); cout << "]" << string(Space, ' '); }; template <typename Elm> void ZOUT(const ll& FlatHier, const ll& Indent, const ll& Space, const queue<Elm>& Que) { queue<Elm> Datas = Que; if (FlatHier > 0 && Indent > 0) cout << endl << string(Indent, ' '); cout << "(" << string(Space, ' '); if (FlatHier == 1) cout << endl << string(Indent + (1 + Space), ' '); while (!Datas.empty()) { Elm Data = Datas.front(); Datas.pop(); ZOUT(max<ll>(0, FlatHier - 1), Indent + (FlatHier > 0 ? 3 : 0), Space, Data); } if (FlatHier >= 1) cout << endl << string(Indent, ' '); cout << "]" << string(Space, ' '); }; template <typename Elm> void ZOUT(const ll& FlatHier, const ll& Indent, const ll& Space, const priority_queue<Elm>& Que) { priority_queue<Elm> Datas = Que; if (FlatHier > 0 && Indent > 0) cout << endl << string(Indent, ' '); cout << "(" << string(Space, ' '); if (FlatHier == 1) cout << endl << string(Indent + (1 + Space), ' '); while (!Datas.empty()) { Elm Data = Datas.top(); Datas.pop(); ZOUT(max<ll>(0, FlatHier - 1), Indent + (FlatHier > 0 ? 3 : 0), Space, Data); } if (FlatHier >= 1) cout << endl << string(Indent, ' '); cout << "]" << string(Space, ' '); }; template <typename Elm> void ZOUT(const ll& FlatHier, const ll& Indent, const ll& Space, const deque<Elm>& Que) { deque<Elm> Datas = Que; if (FlatHier > 0 && Indent > 0) cout << endl << string(Indent, ' '); cout << "(" << string(Space, ' '); if (FlatHier == 1) cout << endl << string(Indent + (1 + Space), ' '); while (!Datas.empty()) { Elm Data = Datas.front(); Datas.pop_front(); ZOUT(max<ll>(0, FlatHier - 1), Indent + (FlatHier > 0 ? 3 : 0), Space, Data); } if (FlatHier >= 1) cout << endl << string(Indent, ' '); cout << "]" << string(Space, ' '); }; } // namespace elm namespace branch { void ZOUT_branch(const ll& FlatHier, const ll& Indent, const ll& Space) {}; template <typename HeadArg, typename... Args> void ZOUT_branch(const ll& FlatHier, const ll& Indent, const ll& Space, HeadArg&& headArg, Args&&... args) { zz_print::elm::ZOUT(FlatHier, Indent, Space, headArg); ZOUT_branch(FlatHier, Indent, Space, std::forward<Args>(args)...); }; template <typename HeadArg, typename... Args> void ZOUT_branch(const ll& FlatHier, const ll& Indent, const ll& Space, HeadArg& headArg, Args&... args) { zz_print::elm::ZOUT(FlatHier, Indent, Space, headArg); ZOUT_branch(FlatHier, Indent, Space, std::forward<Args>(args)...); }; } // namespace branch /// @brief プリント関数 /// @tparam FlatHier 改行による階層表示数 (default 0 改行なし) /// @tparam Space 表示スペース間隔 (default 2) /// @tparam InitIndent インデント間隔 (default 0) /// @tparam ...Args 可変引数型 (指定する必要なし) /// @param ...args 可変引数 template <ll FlatHier = 0, ll Space = 2, ll InitIndent = 0, typename... Args> void zout(Args&&... args) { cout << flush; branch::ZOUT_branch(FlatHier, InitIndent, Space, std::forward<Args>(args)...); cout << endl; }; }; // namespace zz_print using namespace zz_print; namespace zz_prime { class prime { public: static vl sieve; static vl p; static void set(ll N = 1000000) { N = max<ll>(2, N) + 1; sieve = vl(N, 0); p.clear(); sieve[0] = 1; sieve[1] = 1; cnt(i, 2, N - 1) { if (sieve[i] == 0) { p.push_back(i); ll j = i; while (j < N) { if (sieve[j] == 0) sieve[j] = i; j += i; } } } }; static bool isprime(ll x) { if (x <= 1) return false; if (sieve.empty()) set(); if (x < sieve.size()) return (sieve[x] == x); each(ite, p) { if (x < (*ite) * (*ite)) return true; if ((x % (*ite)) == 0) return false; } return true; }; static vxy factor(ll x) { x = max<ll>(1, x); if (sieve.empty()) set(); map<ll, ll> MAP; each(ite, p) { if (x < sieve.size()) break; while ((x % (*ite)) == 0) { MAP[*ite]++; x /= *ite; } } if (x < sieve.size()) { while (x > 1) { MAP[sieve[x]]++; x /= sieve[x]; } } else { MAP[x]++; } vxy fact; each(ite, MAP) fact.push_back(*ite); return fact; }; static vl divisors(const vxy& fact) { vl ans(1, 1); function<void(const ll&, const ll&)> Func = [&fact, &ans, &Func](const ll& I, const ll& Elm) -> void { if (fact.empty()) return; ll Add = 1; if ((I + 1) < fact.size()) { Func(I + 1, Elm); } else { if (Elm != 1) ans.emplace_back(Elm); } cnt(i, 1, fact[I].second) { Add *= fact[I].first; if ((I + 1) < fact.size()) { Func(I + 1, Elm * Add); } else { ans.emplace_back(Elm * Add); } }; }; Func(0, 1); sort(ans.begin(), ans.end()); return ans; }; }; vl prime::p; vl prime::sieve; } // namespace zz_prime using namespace zz_prime; map<vl, ll> MAP; ///////////////////////////////////////////////// void solve(string& S) { vl Vec(10, 0); ll M = S.size(); rep(i, M) { if (S[i] != '0') { Vec[S[i] - '0']++; } } auto ITE = MAP.find(Vec); if (ITE != MAP.end()) { cout << ITE->second << endl; return; } cout << -1 << endl; } ///////////////////////////////////////////////// int main() { ll I = 1; while ((I * I) <= 1000000000) { ll X = I * I; vl Vec(10, 0); while (X > 0) { if ((X % 10) != 0) { Vec[X % 10]++; } X /= 10; } // zout(*ite, Vec); if (MAP[Vec] == 0) MAP[Vec] = I * I; I++; } ll T; cin >> T; vs N(T); rep(i, T) cin >> N[i]; rep(i, T) solve(N[i]); return 0; }