110をブロックと考えて分割する. 個のブロックに分ける.
実装を簡単にするため,110のブロックを 個並べた文字列 を用意する.
のとき, の最初の3文字によって場合分けして考える. の形も,同じ形の繰り返しになり,最後に余った部分が出てくる.
が の連続する部分列として考えるが, の 文字目( )から一致するとして場合分けする.
一致した部分が ブロック目までだとすると, 答えは .
のときは個別にチェックする.
使っている記号,マクロ等 "https://ecsmtlir.hatenablog.com/entry/2022/12/23/131925"
int main() {
ll n;
cin >> n;
string t; cin >> t;
ll pow = 1;
rep(i,10) pow *= 10;
if(t.length() == 1){ // コーナー
if(t == "1"){
cout << pow * 2 << endl;
return 0;
}
}
string x;
rep(i,n+5){
x += "110";
}
rep(i,3){
bool f = true;
rep(j,t.length()){
if(x[i+j] != t[j]) {
f = false ;
break;
}
}
if(f){
ll k = (i+t.length()+2)/3;
cout << pow - k + 1 << endl;
return 0;
}
}
cout << 0 << endl;
return 0;
}