top1编程
← 返回题目
题解

【基础】超级字符串

1 条题解

  • 0
    @ 2026-7-29 0:15:19
    #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