結果
| 問題 |
No.2864 String of yuusaan
|
| コンテスト | |
| ユーザー |
Moss_Local
|
| 提出日時 | 2024-08-30 21:39:43 |
| 言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
RE
|
| 実行時間 | - |
| コード長 | 1,466 bytes |
| コンパイル時間 | 1,035 ms |
| コンパイル使用メモリ | 88,516 KB |
| 実行使用メモリ | 6,948 KB |
| 最終ジャッジ日時 | 2024-08-30 21:39:47 |
| 合計ジャッジ時間 | 3,491 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 2 WA * 1 RE * 15 |
ソースコード
#include <iostream>
#include <vector>
using namespace std;
const string base = "yuusaan";
// 各レベルの文字列の長さを保存する配列
vector<long long> length_cache(16, 0);
// レベルNの長さをキャッシュを使って計算する関数
long long calculate_length(int level) {
if (length_cache[level] != 0) {
return length_cache[level];
}
if (level == 1) {
length_cache[level] = base.size();
} else {
long long prev_length = calculate_length(level - 1);
length_cache[level] = 6 * prev_length + (prev_length - base.size());
}
return length_cache[level];
}
// レベルNの文字列のK文字目を取得する再帰関数
char find_character(int level, long long k) {
if (level == 1) {
return base[k - 1];
}
long long prev_length = calculate_length(level - 1);
for (char c : base) {
if (c == 'y' || c == 'n') {
if (k <= prev_length) {
return find_character(level - 1, k);
} else {
k -= prev_length;
}
} else {
if (k == 1) {
return c;
}
k--;
}
}
return '?'; // ここに到達することはない
}
int main() {
int N;
long long K;
cin >> N >> K;
// 各レベルの長さを事前に計算しておく
calculate_length(N);
cout << find_character(N, K) << endl;
return 0;
}
Moss_Local