競技プログラミング日記

主に AtCoder の記事です

AtCoder Regular Contest 110B

 

ARC110B

110をブロックと考えて分割する. 10^{10} 個のブロックに分ける.
実装を簡単にするため,110のブロックを  |T| 個並べた文字列 x を用意する.
 |T| \geq 3 のとき, T の最初の3文字によって場合分けして考える.  T の形も,同じ形の繰り返しになり,最後に余った部分が出てくる.
 T  X の連続する部分列として考えるが,  X  i 文字目(  i \in 3 )から一致するとして場合分けする.
一致した部分が  k ブロック目までだとすると, 答えは  10^{10} - k + 1 .

 |T| = 1, 2 のときは個別にチェックする.

使っている記号,マクロ等 "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;
}