本题不妨逆推。
对于长度为的字符串 ,若要求第位的延展,考虑 在最后一次延展前的位置。
若延展结束后的长度为,每次考虑以下内容:
-
若 ,说明本次伸展无效, ,不变。
-
若,说明 nn是延展出来加在开头的字符,
-
若,则伸展前为,
-
循环以上操作,直到即已经恢复到原始状态,输出此时对应的字符即可。
#include<bits/stdc++.h> using namespace std; string s; long long lenc,len,n; int main(){ ios::sync_with_stdio(false); cin.tie(0),cout.tie(0); cin>>s; lenc=len=s.length(); cin>>n; while(lenc<n) lenc*=2; while(n>len){ if(n==lenc/2+1){n=lenc/2; lenc/=2; continue;} if(n<lenc/2){lenc/=2; continue;} n=n-lenc/2-1; lenc/=2; } cout<<s[n-1]; return 0; }