atcoder#ABC158E. [ABC158E] Divisible Substring

[ABC158E] Divisible Substring

配点 : 500500

問題文

高橋君は 0 から 9 までの数字から成る長さ NN の文字列 SS を持っています。

素数 PP が好きな高橋君は、SS の空でない連続する部分文字列 N×(N+1)/2N \times (N + 1) / 2 個のうち、十進表記の整数と見なした際に PP で割り切れるものの個数を知りたくなりました。

ただし部分文字列は先頭が 0 であっても良いものとし、文字列として等しい場合や、整数と見なした際に等しい場合も、部分文字列の SS 内の位置で区別します。

高橋君のためにこの個数を計算してください。

制約

  • 1N2×1051 \leq N \leq 2 \times 10^5
  • SS は数字から成る
  • S=N|S| = N
  • 2P100002 \leq P \leq 10000
  • PP は素数である

入力

入力は以下の形式で標準入力から与えられる。

NN PP

SS

出力

SS の空でない連続する部分文字列であって、十進表記の整数と見なした際に PP で割り切れるものの個数を出力せよ。

4 3
3543
6

SS = 3543 です。SS の空でない連続する部分文字列は次の 1010 個があります。

  • 333 で割り切れる。
  • 3533 で割り切れない。
  • 35433 で割り切れる。
  • 354333 で割り切れる。
  • 533 で割り切れない。
  • 5433 で割り切れる。
  • 54333 で割り切れる。
  • 433 で割り切れない。
  • 4333 で割り切れない。
  • 333 で割り切れる。

このうち 33 で割り切れるものは 66 個であるので、66 を出力してください。

4 2
2020
10

SS = 2020 です。SS の空でない連続する部分文字列は 1010 個ありますが、その全てが 22 で割り切れるので 1010 を出力してください。

先頭が 0 である部分文字列も許容されることに注意してください。

20 11
33883322005544116655
68