题解:B4102 [CSP-X2023 山东] 克隆机
B4102 [CSP-X2023 山东] 克隆机
Solution
题目理解
有一个克隆过程,初始时有
核心思路
初始情况: 如果
模拟过程: 如果
规律发现:
假设当前队列长度为
每一轮克隆,都会把前
关键在于,第
当
- 如果
n 是在第一轮克隆中被取出的,那么n 肯定是在前k 个位置。 - 如果
n 不是在第一轮克隆中被取出的,那么它一定是在第一轮克隆后新加入的队列中。 - 假设第一轮克隆后,队列长度变为
2k ,那么第一轮克隆后,新加入的队列的前k 个元素,就是第一轮克隆的种子,也就是前k 个种子。 - 那么,第
n 个被克隆的种子,实际上是第(n - k - 1) \div 2 个被克隆的种子,因为前k 个种子被克隆了,并且放到了队尾,所以第n 个被克隆的种子,实际上是第(n-k) 个种子,而这(n-k) 个种子,实际上是前(n-k)\div2 个种子被克隆出来的。
也就是说,我们可以把
具体实现:可以使用递归或迭代的方式倒推,直到
Code
#include <iostream>
using namespace std;
long long k, n;
int main() {
cin >> k >> n;
if (n <= k)
cout << char('A' + n - 1);
else {
n--;
while (n >= k)
n = (n - k) / 2;
cout << char('A' + n);
}
return 0;
}