#include using namespace std; const string one = ""; string to_str(int num) { if(num == 1) return one; string ret = ""; while(num) { ret.push_back('0' + (num&1)); num >>= 1; } ret.pop_back(); reverse(ret.begin(), ret.end()); return ret; } int to_num(const string& s) { if(s == one) return 1; int ret = 1; for(char c : s) { ret <<= 1; ret += c - '0'; } return ret; } vector get_factorials(int N) { vector fact(N + 1, 1); for (int i = 1; i <= N; ++i) { fact[i] = fact[i - 1] * i; } return fact; } vector get_permutation_at(int N, long long k) { auto fact = get_factorials(N); // 利用可能な数字のリスト [1, 2, ..., N] vector digits(N); iota(digits.begin(), digits.end(), 1); vector result; k--; // 0-indexed に変換 for (int i = N - 1; i >= 0; --i) { long long f = fact[i]; // 残りの桁の並べ方(通り数) int idx = k / f; // 現在の桁で選ぶべき数字のインデックス k %= f; // 次の桁への余り result.push_back(digits[idx]); digits.erase(digits.begin() + idx); // 使用した数字を削除 } return result; } int get_permutation_index(const vector& p) { int N = p.size(); auto fact = get_factorials(N); vector used(N + 1, false); int rank = 0; for (int i = 0; i < N; ++i) { int f = fact[N - 1 - i]; // この位置より後ろの並べ方 // p[i] より小さく、かつ「まだ使われていない」数字の個数を数える int count = 0; for (int j = 1; j < p[i]; ++j) { if (!used[j]) { count++; } } rank += count * f; used[p[i]] = true; // 使用済みにする } return rank + 1; // 1-indexed に戻して返す } void Alice() { int N, Q; cin >> N >> Q; vector A(N); for(auto& a : A) cin >> a; vector S(min(N, 13)); for(int i = 0; i < min(N, 13); i++) { S[i] = to_str(A[i]); } if(N == 14) { auto perm = get_permutation_at(N-1, A[N-1]); vector nS(N-1); for(int i = 0; i < N-1; i++) nS[i] = S[perm[i]-1]; S.swap(nS); } cout << S.size() << endl; for(auto& s : S) cout << s << endl; return; } void Bob() { int N, Q; cin >> N >> Q; int K; cin >> K; vector S(K); for(auto& s : S) cin >> s; vector A(N); for(int i = 0; i < min(N, 13); i++) A[i] = to_num(S[i]); if(N == 14) { vector I(K), perm(K); iota(I.begin(), I.end(), 0); sort(I.begin(), I.end(), [&](int i, int j){ return A[i] < A[j]; }); for(int i = 0; i < K; i++) perm[I[i]] = i + 1; A[N-1] = get_permutation_index(perm); } sort(A.begin(), A.end()); for(int i = 0; i < N; i++) cout << A[i] << (i < N-1 ? " " : "\n"); cout << flush; return; } int main() { string player; cin >> player; if(player == "Alice") Alice(); else Bob(); }