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: