変な時間帯だったので不参加です。
https://codeforces.com/contest/1280/problem/A
問題
数字で構成される文字列Sが与えられる。
今、カーソルが左端にあるとする。
以下の処理をX回繰り返す。
- カーソルを1つ右に動かす
- カーソルの右側の文字列をクリップボードにコピーする
- カーソル位置の数字の回数だけ末尾にペーストする。
Sの最終的な文字列長を求めよ。
解法
Sはペーストによって末尾に文字列が追加されることはあっても、既存の文字が減ったり変更したりすることはない。
そこで、Sの長さがXを超えるまでは、愚直に処理を繰り返そう。
それ以降は文字列長だけ覚えておけばよい。
int T; int X; int N; string S; ll mo=1000000007; void solve() { int i,j,k,l,r,x,y; string s; cin>>T; while(T--) { cin>>X>>S; ll cur=S.size(); FOR(i,X) { if(S.size()<1<<20) { if(S[i]=='2') S+=S.substr(i+1); if(S[i]=='3') S+=S.substr(i+1)+S.substr(i+1); } if(S[i]=='2') (cur+=cur-(i+1))%=mo; if(S[i]=='3') (cur+=2*(cur-(i+1)))%=mo; } cout<<(cur%mo+mo)%mo<<endl; } }
まとめ
Div1 Aにしても謎な問題。
何がしたいんだろう。