Official

C - Multiple of 7 Editorial by maroonrk_admin


\(s\)\(i\) 文字目から \(|s|\) 文字目までを数として見たときの値を \(a_i\) とおきます. 便利のため,\(a_{|s|+1}=0\) とおきます.

整数の組 \((l,r)\) が条件を満たすということは,\((a_l-a_{r+1})/10^{|s|-r}\)\(7\) で割り切れるということです. ところで,\(10^{|s|-r}\)\(7\) と互いに素であるので,上の条件は結局,\(a_l-a_{r+1}\)\(7\) で割り切れるということと同値です.

\(b_i\)\(a_i\)\(7\) で割った余りと定義します. さらに,各 \(0 \leq v < 7\) について,\(b_i=v\) を満たす \(i\) の個数を \(c_v\) と定義します.

条件を満たす整数の組 \((l,r)\)\(N\) 個であるということは,\(b_l=b_{r+1}\) を満たす \((l,r)\) の個数が \(N\) 個ということと同値で,これはさらに \(\sum_{0 \leq v < 7} c_v(c_v-1)/2=N\) と言い換えられます.

まず上の条件を満たす \(c_v\) を求めることを考えます. これは貪欲法で求めることができます. 具体的には,\(c_0,c_1,\cdots,c_6\) を順に定めていき,\(c_k\) を決める際には \(\sum_{0 \leq v \leq k} c_v(c_v-1)/2 \leq N\) を満たす中で最大の \(c_k\) を選択すればよいです.

実際にこの貪欲法を行うと,この問題の制約の範囲ではすべての \(N\) について条件を満たす \(c_v\) が求まります. (なお,この方法では一般の \(N\) では解くことができませんが,多角数定理を用いれば解くことができます.)

\(c_v\) が求まった後は,それに沿って \(b_i\) を定めていきます. \(b_{i+1}\) が決まっているとき,\(s\)\(i\) 文字目を 1, 2, \(\cdots\), 7 のうち適切なものにすることで,\(b_i\) の値を好きに選ぶことができます. よって,後ろから定めていけば構成が完了します.

posted:
last update: