結果
| 問題 |
No.3204 Permuted Integer
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-07-18 21:53:32 |
| 言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 23,644 bytes |
| コンパイル時間 | 4,151 ms |
| コンパイル使用メモリ | 301,432 KB |
| 実行使用メモリ | 8,192 KB |
| 最終ジャッジ日時 | 2025-07-18 21:53:44 |
| 合計ジャッジ時間 | 8,898 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| 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;
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']++;
}
}
// zout(S,Vec,MAP[Vec]);
auto ITE = MAP.find(Vec);
if (ITE != MAP.end() && ITE->second != 0) {
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++;
}
// reach(ite, MAP) zout(ite->first, ite->second);
ll T;
cin >> T;
vs N(T);
rep(i, T) cin >> N[i];
rep(i, T) solve(N[i]);
return 0;
}