

题意:
你有 n 台机器围成一个圆环,其中 n 最多为 20。每台机器要么是 A 型,要么是 B 型。机器按顺时针方向从 1 到 n 编号,第 i 台机器的类型记为 si。每台机器会接收一个整数 x,并根据其类型更新 x:
A 型:将 x 减 1。形式化地,更新规则为 x:=x−1。
B 型:将 x 替换为它的半向下取整值。形式化地,更新规则为 x:=⌊2x⌋,其中 ⌊y⌋ 表示对 y 向下取整,即不大于 y 的最大整数。
你会得到 q 次查询,每次查询包含一个整数 a。在每次查询中,你从 1 号机器 开始,手持一个初始整数 a。每一秒钟,会按顺序发生以下两个动作:
- 若当前在第 i 台机器(1≤i≤n−1),则移动到第 i+1 台。
- 若当前在第 n 台机器,则移动回第 1 台。
这个过程会持续进行,直到你的整数 a 变为 0。对于每次查询,请计算让 a 变为 0 所需的总秒数。
注意:所有查询之间相互独立。
输入
每个测试包含多组测试用例。第一行是测试用例数 t(1≤t≤104),随后是各组测试用例的描述。
每组测试用例的第一行包含两个整数 n 和 q(1≤n≤20,1≤q≤104)—— 分别表示机器的数量和查询的数量。
每组测试用例的第二行是一个字符串 s(∣s∣=n,且 si 为 A 或 B)—— 代表各台机器的类型。
每组测试用例的第三行包含 q 个整数 a1,a2,…,aq(1≤ai≤109)—— 每次查询的初始整数。
注意:所有测试用例的 n 之和没有限制。
保证所有测试用例的 q 之和不超过 104。
输出
对于每组测试用例,输出 q 个整数,分别表示每次查询的答案。
思路:
每次查询的初始整数a就是从机器1开始循环,直到循环a次,而且机器最多20台,那么机器中但凡有一个B类型,就不会超时,所以只有n台机器全为A类型时会超时,进行单独判断。
#include <iostream>
#include <vector>
using namespace std;
#define int long long
void solve()
{
int n, q;
cin >> n >> q;
string s;
cin >> s;
int nb = 0;
for (int i = 0; i < n; i++)
{
if (s[i] == 'B') nb++;
}
while (q–)
{
int a;
cin >> a;
int num = 0;
int time = 0;
if (nb == 0)
{
cout << a << '\\n';
continue;
}
while (a > 0)
{
if (s[num % n] == 'A')
{
time++;
num++;
a = a – 1;
}
else
{
time++;
num++;
a = a / 2;
}
}
cout << time << '\\n';
}
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int t;
cin >> t;
while (t–)
{
solve();
}
return 0;
}


