#include #include #include #include #include #include // 128ビット整数型を 'int128' として扱う using int128 = __int128_t; // int128を出力するためのヘルパー関数 std::ostream& operator<<(std::ostream& os, int128 val) { if (val < 0) { os << "-"; val = -val; } if (val == 0) { return os << "0"; } std::string s = ""; while (val > 0) { s += (val % 10) + '0'; val /= 10; } std::reverse(s.begin(), s.end()); return os << s; } // タイプQにおけるPの値の、iとwに依存する部分を計算する関数 int128 calc_p_iw_part(long long IL, long long I_rem, long long IC, long long WC, long long W_rem, char type) { // 不正な分割でないかチェック if (IL < 0 || IL > I_rem) { return -1; } long long IR = I_rem - IL; // 1^2 + ... + N^2 などの和の計算。オーバーフロー防止のため int128 を使用 int128 wc_128 = WC; int128 sum_j = wc_128 * (wc_128 + 1) / 2; int128 sum_j_sq = wc_128 * (wc_128 + 1) * (2 * wc_128 + 1) / 6; // Cブロック内のwが作るPへの貢献度 int128 sum_term = wc_128 * IL * (IR + IC) + (IR + IC - IL) * sum_j - sum_j_sq; // 残りのw (W_rem) が作るPへの貢献度 int128 w_rem_term = 0; if (type == 'a') { // y..i..[w..C]..i..y の構造 w_rem_term = (int128)W_rem * IL * (IC + IR); } else { // y..i..[C..w]..i..y の構造 w_rem_term = (int128)W_rem * (IL + IC) * IR; } return w_rem_term + sum_term; } // 各テストケースを解くメインの関数 void solve() { long long Y, I, W; long long A, B; std::cin >> Y >> I >> W >> A >> B; // --- 最適解を記録するための変数 --- int128 max_score = -1; std::string best_str = ""; // --- 戦略1: タイプP (P-重視) --- { long long YL_p = Y / 2; long long YR_p = Y - YL_p; long long IL_p = I / 2; long long IR_p = I - IL_p; int128 p_val = (int128)W * YL_p * YR_p * IL_p * IR_p; int128 current_score = (int128)A * p_val; if (current_score > max_score) { max_score = current_score; best_str = std::string(YL_p, 'y') + std::string(IL_p, 'i') + std::string(W, 'w') + std::string(IR_p, 'i') + std::string(YR_p, 'y'); } } // --- 戦略2: タイプQ (Q-重視) --- long long k = 0; if (I >= 2 && W >= 1) { k = std::min(I - 2, W - 1); } if (k > 0) { long long IC = k + 2; long long WC = k + 1; long long I_rem = I - IC; long long W_rem = W - WC; long long YL_q = Y / 2; long long YR_q = Y - YL_q; int128 p_y_part = (int128)YL_q * YR_q; std::string c_block = "i"; for (int i = 0; i < k + 1; ++i) c_block += "wi"; // --- 候補 (a): y..i..[w..C]..i..y --- { int128 b_coeff = (int128)W_rem * (I_rem + IC) + (int128)WC * (I_rem + IC - WC - 1); int128 a_coeff_abs = W; long double axis = (long double)b_coeff / (2.0L * a_coeff_abs); long long IL_center = round(axis); int128 p_iw_max = -1; long long IL_best = -1; // 軸周辺の整数を試し、浮動小数点誤差をなくす for (long long il = std::max(0LL, IL_center - 5); il <= std::min(I_rem, IL_center + 5); ++il) { int128 current_p_iw = calc_p_iw_part(il, I_rem, IC, WC, W_rem, 'a'); if(current_p_iw > p_iw_max){ p_iw_max = current_p_iw; IL_best = il; } } if(IL_best != -1){ int128 p_val = p_y_part * p_iw_max; int128 current_score = (int128)A * p_val + (int128)B * k; if(current_score > max_score){ max_score = current_score; long long IR_best = I_rem - IL_best; best_str = std::string(YL_q, 'y') + std::string(IL_best, 'i') + std::string(W_rem, 'w') + c_block + std::string(IR_best, 'i') + std::string(YR_q, 'y'); } } } // --- 候補 (b): y..i..[C..w]..i..y --- { int128 b_coeff = (int128)W_rem * (I_rem - IC) + (int128)WC * (I_rem + IC - WC - 1); int128 a_coeff_abs = W; long double axis = (long double)b_coeff / (2.0L * a_coeff_abs); long long IL_center = round(axis); int128 p_iw_max = -1; long long IL_best = -1; for (long long il = std::max(0LL, IL_center - 5); il <= std::min(I_rem, IL_center + 5); ++il) { int128 current_p_iw = calc_p_iw_part(il, I_rem, IC, WC, W_rem, 'b'); if(current_p_iw > p_iw_max){ p_iw_max = current_p_iw; IL_best = il; } } if(IL_best != -1){ int128 p_val = p_y_part * p_iw_max; int128 current_score = (int128)A * p_val + (int128)B * k; if(current_score > max_score){ max_score = current_score; long long IR_best = I_rem - IL_best; best_str = std::string(YL_q, 'y') + std::string(IL_best, 'i') + c_block + std::string(W_rem, 'w') + std::string(IR_best, 'i') + std::string(YR_q, 'y'); } } } } // Y,I,W>0なのに解が見つからない場合(通常は起こらない)、デフォルト文字列を生成 if (max_score == -1 && (Y > 0 || I > 0 || W > 0)) { best_str = std::string(Y, 'y') + std::string(I, 'i') + std::string(W, 'w'); } std::cout << best_str << std::endl; } int main() { // 高速化のためのおまじない std::ios_base::sync_with_stdio(false); std::cin.tie(NULL); int t; std::cin >> t; while (t--) { solve(); } return 0; }