题解:很容易看出是一道推倒公式的题目 f(n) = aaa+f(n-1)+bbb+f(n-1)+ccc ,abc所对应的字符串在题目中已经告诉了。之后直接dfs往下深搜一直减k直到k在aaa||f(n-1)||bbb||f(n-1)||ccc这五个区域中,如果在f(n-1)中则接着往下搜。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
char a[100] = "What are you doing at the end of the world? Are you busy? Will you save us?";
//75
char x[50] = "What are you doing while sending \"";
char y[50] = "\"? Are you busy? Will you send \"";
char z[20] = "\"?";
//34
//32
//2
ll num[100010];
ll lena,lenx,leny,lenz;
char judge;
void init(){
lena = strlen(a);
lenx = strlen(x);
leny = strlen(y);
lenz = strlen(z);
num[0] = lena;
for(int i = 1 ; i <= 55 ; i++){
num[i] = lenx+num[i-1]+leny+num[i-1]+lenz;
}
for(int i = 56 ; i <= 100000 ; i++){
num[i] = LLONG_MAX;
}
}
char dfs(ll n,ll k){
if(k>=num[n]) return '.';
if(n==0){
return a[k];
}
if(k<lenx){
return x[k];
}
k-=lenx;
if(k<num[n-1]){
return dfs(n-1,k);
}
k-=num[n-1];
if(k<leny){
return y[k];
}
k-=leny;
if(k<num[n-1]){
return dfs(n-1,k);
}
k-=num[n-1];
if(k<lenz){
return z[k];
}
}
int main(){
ll T,n,k;
init();
cin>>T;
while(T--){
cin>>n>>k;
cout<<dfs(n,k-1);
}
// ll c = strlen(b);
// cout<<c<<endl;
}