AT274の技術だったりなかったり

あっとのTECH LOG

競プロのこととか技術のこととか。たまに日常を書きます。

ABC158 E - Divisible Substring

問題原文

E - Divisible Substring

問題要旨

0 ~ 9 からなる文字列  S が与えられる。
 S の連続する区間を10進数と見立てたとき、それが 素数  P の倍数になっているようなものの通り数はいくつか。

解法

これ(は?)
at274.hatenablog.com

まぁこっちの方が後出なんですが。。。
 P = 2, 5 のときは 10 と互いに素んいならないので、別の方法で処理する必要があるので気をつける。(末尾だけ見ればいいね)

実装

from collections import Counter
N, P = map(int, input().split())
S = input()

if 10 % P == 0:
    ans = 0
    for i, s in enumerate(S, start=1):
        if int(s) % P != 0:
            continue
        ans += i
    print(ans)

else:
    X = [0]
    for i, s in enumerate(S[::-1]):
        X.append((X[-1] + pow(10, i, P) * int(s)) % P)

    C = Counter(X)
    ans = 0
    for v in C.values():
        ans += v * (v - 1) // 2
    print(ans)

感想

なんでこれ復習してなかったんですか。。。。???????