#include<bits/stdc++.h>
using namespace std;
#define ll long long
char s[200001];
ll l=0,num=0;
ll pd2(int k){
int a = 1;
while(l*a < k){
a *= 2;
num++;
}
return a;
}
ll dfs(ll k){
ll m = pd2(k);
ll x = k - l*(m/2);
if(m == 1)return x;
return dfs(x);
}
void solve(ll k){
int index = dfs(k) - 1;
if((num - 1) % 2)//如果是奇数次变化的字符串,则不变
printf("%c ", s[index]);
else {//偶数次,变化了
if('a' <= s[index]&& 'z' >= s[index])
printf("%c ", s[index] - 32);
else printf("%c ",s[index] + 32);
}num=0;
}
int main(){
int q = 0;
scanf("%s", s);
scanf("%d", &q);
l=strlen(s);
for(int i = 1; i <= q; i++){
ll k;
scanf("%lld", &k);
solve(k);
}
return 0;
}
思路: 1.找到最小的m,使k <= 2^m && k > 2^(m-1)
2.令k - 2^(m-1) 为新的递归参数,重复第一步直到 k - 2^(m-1) 比字符串长度小
3.最后判断字符串变化次数的奇偶性,奇数次不变,偶数次改变