No.3244 Range Multiple of 8 Query
タグ : / 解いたユーザー数 52
作問者 :


問題文
長さ $M$ の文字列 $X$ に対する操作を,以下のように定めます.
- 操作:$1 \leq i \leq M - 1$ を満たす整数 $i$ を $1$ つ選ぶ.$X$ の $i$ 文字目と $i+1$ 文字目を入れ替える.
$1$ から $9$ までの数字からなる文字列 $T$ に対して,$f(T)$ を次のように定めます.
- $T$ に対して操作を $0$ 回以上好きな回数行えるとき,$T$ を十進表記の整数として見たときに $8$ の倍数にするために必要な操作の回数の最小値.ただし,どのように操作を行っても不可能な場合は $f(T) = -1$ とする.
長さ $N$ の,$1$ から $9$ までの数字のみからなる文字列 $S$ が与えられます.
以下に示す $Q$ 個のクエリが与えられるので,それぞれに対して答えてください.
- クエリ $i$:$1 \leq l_i \leq r_i \leq N$ を満たす整数の組 $(l_i, r_i)$ が与えられる.$S$ の $l_i$ 文字目から $r_i$ 文字目までからなる部分文字列を $S[l_i, r_i]$ とするとき,$f(S[l_i, r_i])$ を求めよ.
制約
- $N, Q, l_i, r_i$ は整数
- $S$ は $1$ から $9$ までの数字からなる長さ $N$ の文字列
- $1 \leq N \leq 2.88 \times 10^5$
- $1 \leq Q \leq 2.88 \times 10^5$
- $1 \leq l_i \leq r_i \leq N$
入力
入力は以下の形式で標準入力から与えられる.
$N$ $Q$ $S$ $l_1$ $r_1$ $l_2$ $r_2$ $\vdots$ $l_Q$ $r_Q$
出力
$Q$ 行出力せよ.$i \ (1 \leq i \leq Q)$ 行目には,$i$ 番目のクエリに対する答えを出力せよ.
サンプル
サンプル1
入力
15 4 123456789111141 6 9 3 6 10 13 8 15
出力
3 0 -1 7
$1$ 番目のクエリでは,$S[6, 9] = 6789$ です.これを $T$ とします.次のように操作を行うことで,$3$ 回の操作で $T$ を十進表記の整数として見たときの値が $8$ の倍数になります.
- $i = 1$ を選ぶ.$T$ の $1$ 文字目と $2$ 文字目を入れ替える.$T = 7689$ となる.
- $i = 3$ を選ぶ.$T$ の $3$ 文字目と $4$ 文字目を入れ替える.$T = 7698$ となる.
- $i = 2$ を選ぶ.$T$ の $2$ 文字目と $3$ 文字目を入れ替える.$T = 7968$ となる.
$7968 = 996 \times 8$ なので,$7968$ は $8$ の倍数となります.$2$ 回以下の操作で $T$ を十進表記の整数として見たときの値を $8$ の倍数にすることはできないため,答えは $3$ となります.
$2$ 番目のクエリでは,$S[3, 6] = 3456$ です.$432 \times 8 = 3456$ なので,操作を $1$ 回も行わずとも最初から $S[3, 6]$ を十進表記の整数として見たときの値は $8$ の倍数です.
$3$ 番目のクエリでは,$S[10, 13] = 1111$ です.どのように操作を行っても $S[10, 13]$ を十進表記の整数として見たときの値を $8$ の倍数にすることはできないため,$-1$ を出力してください.
提出するには、Twitter 、GitHub、 Googleもしくは右上の雲マークをクリックしてアカウントを作成してください。