ARC129C 精進メモ

問題

atcoder.jp

思考過程

パッと見てどう構築するか思いつかず、色々と手で書いて考えてみる。

後ろに継ぎ足して生やしていこうとすると、場合の数を数えるのが色々とややこしくなりそう。

簡単に数えられるのは、ひたすら "7" を続ける場合で、k個続けるなら  k (k - 1) / 2個の組ができることまではわかる。
kの値を変えてできる数列にでてくる数を組み合わせて、Nが作れないだろうか……?、7の連続する間を "1" とかでくっつければできたりしないだろうか…?

簡単に実験してみると、 10^6までなら6つの数字の組み合わせで実現することが可能っぽい。

 

この方針で提出してみるが、WA。

手元で愚直に通り数を計算するものを探して見ると、  N = 14だと 717717777と出力するが、 71771が7の倍数なのでNGっぽい。

どうもこの方針だと筋が悪そう。  k (k - 1) / 2の値のいくつかの和で表すのはそれっぽそうなんだけど……。

 

この後色々考えていたが思いつかず。解説を見る。

「7の倍数になる区間は、ある桁数で区切った時の端からの7で割ったあまりの数が等しい」ということまではなんとなく考えていたが、「それの数を  k(k -1) / 2のkの値にしていく」、というところに思い至らず。

下から生やす(これまでの値を10倍する)やり方だとうまくいかないという点にややハマりしながらAC。(あまり綺麗なコードにならず)

ACコード

atcoder.jp