結果
問題 |
No.3299 K-th MMA String
|
ユーザー |
![]() |
提出日時 | 2025-10-05 14:52:03 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 1,312 bytes |
コンパイル時間 | 2,832 ms |
コンパイル使用メモリ | 281,188 KB |
実行使用メモリ | 7,716 KB |
最終ジャッジ日時 | 2025-10-05 14:53:37 |
合計ジャッジ時間 | 3,993 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 10 WA * 10 |
ソースコード
#include <bits/stdc++.h> using namespace std; using ll = int64_t; ll N, K; void input() { ios::sync_with_stdio(false); cin.tie(nullptr); cin >> N >> K; } vector<ll> CNT; void kthMMA(ll l, ll k, string& ret) { if (CNT[l-1] >= k) { kthMMA(l - 1, k, ret); ret.push_back('A'); } else if (CNT[l-1] + CNT[l-2] >= k) { kthMMA(l - 2, k - CNT[l-1], ret); ret.push_back('A'); ret.push_back('M'); } else { ll bit = k - CNT[l-1] - CNT[l-2] - 1; ret.resize(l - 2, 'A'); while (bit > 0) { ll b = __builtin_ctz(bit); ret[b] = 'M'; bit &= bit - 1; } ret.push_back('M'); ret.push_back('M'); } } void solve() { CNT.resize(N, 0); CNT[3] = 1; CNT[4] = 4; for (ll i=5; i<N; ++i) { CNT[i] = CNT[i-1] + CNT[i-2] + (1ll << (i - 2)) - 1; } string ret; kthMMA(N, K, ret); reverse(ret.begin(), ret.end()); cout << ret << "\n"; } int main() { input(); solve(); return 0; } /* 考察 長さ N の MMA 文字列は, ・先頭が A ,後ろ N-1 文字が MMA文字列 CNT[N-1] ・先頭が MA ,後ろ N-2 文字が MMA文字列 CNT[N-2] ・先頭が MM ,後ろ N-2 文字が A を 1 個以上含む文字列 2^(N-2)-1 */