君はまるで砂漠に咲く、一輪の花。

僕はその花に引き寄せられる蝶。

Codeforces Round #272 (Div. 2)

はい。
http://codeforces.com/contest/476

A. Dreamoon and Stairs

ざっくりと大意

・Dreamoonは一度の動きで階段を1段か2段どちらか任意で上がれる。
・全部でn段の階段をmの倍数の動きで上がり切ると最小で何回の動きか??
・10段の階段を2の倍数の動作の最小で上がるなら2段4回と1段2回で6回で上がるのが最小動作である。

方針のようなもの

・とりあえず最小動作で上がってから調節する。

n,m=map(int,raw_input().split())
x=n/2
y=n%2

while 1:
    if (x+y)%m==0:
        print x+y
        break
    elif x>0:
        x-=1
        y+=2
    else:
        print -1
        break

n段を上がり切る最小動作が2段上がりがn/2で、1段上がりがn%2である。ここから2段上がりを1回減らして1段上がりを2回増やすと合計の段数は同じで動作回数が1増えるのでmの倍数になるか2段が0になるまで探す。見つからなければ-1である。