题解
【基础】超级字符串
1 条题解
-
0
#include <iostream> #include <vector> #include <string> using namespace std; int main() { long long n; cin >> n; // 初始串:B = "123" (长度 3),A = "4567" (长度 4) // 但注意:我们只关心生成过程中的长度序列 if (n <= 3) { cout << "123"[n-1] << endl; return 0; } if (n <= 7) { cout << "1234567"[n-4] << endl; return 0; } // 构建斐波那契式长度数组:f[0]=3, f[1]=7, f[i] = f[i-1] + f[i-2] vector<long long> f = {3, 7}; // 扩展直到某个长度 >= n while (f.back() < n) { f.push_back(f[f.size()-1] + f[f.size()-2]); } // 从最后一个长度开始倒推 int k = f.size() - 1; // 当前在第 k 步生成的串中 while (k > 1) { long long len_prev1 = f[k-1]; // 前一个串的长度(S_{k-1}) if (n <= len_prev1) { // 在 S_{k-1} 部分 k -= 1; } else { // 在 S_{k-2} 部分,偏移量为 n -= len_prev1; k -= 2; } } // 现在 k == 0 或 1 if (k == 1) { // 对应串是 "1234567" cout << "1234567"[n-1] << endl; } else { // k == 0,对应串是 "123" cout << "123"[n-1] << endl; } return 0; }
- 1