ABC242D
Problem
给定一个字符串 $S$。
设 $S_0=S$,令 $S_i$ 是同时替换 $S_{i-1}$ 中字符的结果,替换规则如下:$A\rightarrow BC$,$B\rightarrow CA$,$C\rightarrow AB$。
查询如下:打印 $S_t$ 的第 $k$ 个字符。
Solution
这个 $10^{18}$ 的数据范围,我们考虑分治。
定义 $\operatorname{dfs}(t,k)$ 表示 $S_t$ 的第 $k$ 个字符。
那么很明显有:
$$t=0\Longrightarrow s_k$$
$$k=0\Longrightarrow\space (s_1+t \bmod{3})\bmod{3}$$
然后考虑转移,因为每一次替换第 $k$ 的位置会映射到 $k\times{2}$,$k\times{2}+1$。
所以有:
$$\operatorname{dfs}(t,k)\Longrightarrow \operatorname{dfs}(t-1,(k+1)\div{2}+1+(k\bmod{2}))$$
Code
#include<bits/stdc++.h>
using LL=long long;
using namespace std;
LL q,t,k,n;
string s;
LL dfs(LL t,LL k){
if(t==0) return s[k]-'A';
if(k==1) return (s[1]-'A'+t%3)%3;
return (dfs(t-1,(k+1)/2)+1+(k%2))%3;
}
int main(){
cin>>s;
n=s.size();
cin>>q;
while(q--){
cin >> t >> k;
cout << char(dfs(t,k)%3+'A') <<endl;
}
return 0;
}