#include #include using namespace std; typedef long long ll; // 定义长整型别名,用于处理大数 int main() { ios::sync_with_stdio(false); cin.tie(0); // 优化输入输出速度 int k; cin >> k; // 读取数字集合大小 vector d(k); // 存储数字集合 for (int i = 0; i < k; i++) { cin >> d[i]; // 读取数字集合元素 } // 检查数字集合是否包含0 bool has_zero = (d[0] == 0); // 计算首位可用数字数量(首位不能为0) int m = has_zero ? k - 1 : k; // 创建首位可用数字数组 vector arr; if (has_zero) { // 如果含0,首位使用除0外的其他数字 arr = vector(d.begin() + 1, d.end()); } else { // 如果不含0,所有数字都可用于首位 arr = d; } // 存储各长度幸运数的数量 vector cnt; // 存储幸运数数量的前缀和 vector prefix; ll total = 0; // 累计幸运数总数 int max_len = 0; // 最大长度 // 计算各长度幸运数的数量 for (int len = 1; ; len++) { ll count_this; // 当前长度的幸运数数量 if (len == 1) { // 长度为1:只有首位数字 count_this = m; } else { count_this = m; // 首位有m种选择 // 计算剩余len-1位的组合数 for (int i = 1; i < len; i++) { // 防止溢出,超过10^18时设为极大值 if (count_this > 1000000000000000000LL / k) { count_this = 1000000000000000001LL; break; } count_this = count_this * k; // 每增加一位,数量乘以k } // 再次检查溢出 if (count_this > 1000000000000000000LL) { count_this = 1000000000000000001LL; } } // 更新总数 total += count_this; // 防止总数溢出 if (total > 1000000000000000000LL) { total = 1000000000000000001LL; } // 存储当前长度数量和前缀和 cnt.push_back(count_this); prefix.push_back(total); max_len++; // 增加长度计数 // 当总数超过10^18时停止计算 if (total >= 1000000000000000000LL) { break; } } int q; cin >> q; // 读取查询数量 while (q--) { ll x; cin >> x; // 读取查询的序号 ll prev = 0; // 存储当前长度之前的所有幸运数数量 int cur_len = -1; // 存储目标幸运数的长度 // 查找目标幸运数所在长度区间 for (int i = 0; i < max_len; i++) { if (x <= prefix[i]) { cur_len = i + 1; // 确定长度 break; } prev = prefix[i]; // 更新前缀和 } // 处理极端情况(理论上不会发生) if (cur_len == -1) { cur_len = max_len; prev = prefix.back() - cnt.back(); } // 计算在当前长度组内的位置 ll pos = x - prev; int r = cur_len - 1; // 剩余位数(除首位外) // 计算剩余位数的基数(k^(r)) ll base_val = 1; if (r > 0) { for (int i = 0; i < r; i++) { // 防止溢出 if (base_val > 1000000000000000000LL / k) { base_val = 1000000000000000001LL; break; } base_val = base_val * k; } // 再次检查溢出 if (base_val > 1000000000000000000LL) { base_val = 1000000000000000001LL; } } // 计算首位在arr中的索引 ll idx0 = (pos - 1) / base_val; cout << arr[idx0]; // 输出首位数字 // 处理剩余位数 if (r > 0) { ll rem = (pos - 1) % base_val; // 剩余部分的位置 vector digits(r, 0); // 存储各位数字索引 // 将rem转换为k进制表示 for (int i = 0; i < r; i++) { digits[r - 1 - i] = rem % k; // 从低位到高位存储 rem /= k; } // 输出剩余位数的数字 for (int i = 0; i < r; i++) { cout << d[digits[i]]; // 输出对应数字 } } cout << '\n'; // 换行 } return 0; }