Skip to content

Instantly share code, notes, and snippets.

@FF256grhy
Last active October 26, 2019 10:28
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save FF256grhy/6424de0e315a242f19620c0019fba004 to your computer and use it in GitHub Desktop.
Save FF256grhy/6424de0e315a242f19620c0019fba004 to your computer and use it in GitHub Desktop.
yukicoder No. 915 解説
yukicoder No. 915 解説
・問題文
No.915 Plus Or Multiple Operation - yukicoder
https://yukicoder.me/problems/no/915
以下のような問題が解ければよい。
初期値 0 の変数 x に対し、以下の2種類の操作が可能である。
[+i]: x += i, i∈[0, C)
[*C]: x *= C
このとき x を A にするための最小操作回数を求めよ。
(C = 1 の場合は不可能なので C > 1 とする)
・例
A = 16, C = 5 の場合、
0[+3][*5][+1] = 16
が最短なので、答えは 3 回である。
・補題1
最適な操作列に [*C][+?][+?] という連続部分列は不要である。
・証明
x[*C][+?] では作れないが x[*C][+?][+?] でなら作れる値の集合は [Cx + C, Cx + 2C - 2] である。
そして x[+1][*C][+?] で [Cx + C, Cx + 2C - 1] を作れるので、[*C][+?][+?] という操作は不要である。
・補題2
最適な操作列の先頭に [+?][+?][+?] は不要である。
・証明
0[+?] や 0[+?][+?] では作れず 0[+?][+?][+?] でのみ作れるのは [2C - 1, 3C - 3] である。
そして C > 2 なら 0[+1or2][*C][+?] で [C, 3C - 1] を作れ、C = 2 なら 0[+1][*2][+1] で { 3 } を作れるので、
どちらにせよ先頭が [+?][+?][+?] である必要はない。
操作 [+?] を n 回以下の回数行うことを <n> と書くことにする。このとき以下が成り立つ。
・定理
最適解を求める際には操作列として以下の形をした列のみを考えればよい。
0 <2> [*C] <1> [*C] <1> [*C] <1> ……
・証明
補題1と2から明らか。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment