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である。