TopCoder SRM 478 Div 1 Easy CarrotJumping

問題概要

数直線上にいるウサギが、初期位置initからジャンプを繰り返してゴールまで行く。
このとき必要なジャンプの最小回数を求めよ。
100000回以下のジャンプでゴールへ到達するのが不可能な場合-1を返せ。


ただし、

  • ゴールは座標がx%1000000007==0である点(そのような点どれでもよい)
  • 座標xにいるウサギのは4*x+3または8*x+7にジャンプできる

解法

4*x+3を小ジャンプ、8*x+7を大ジャンプと呼ぶと、小ジャンプ3回は大ジャンプ2回と等しい。(64*x+63)
したがって、行けるとこまで大ジャンプで行って、残りの1回か2回を小ジャンプするのが最適解。

ソースコード

const int MOD=1000000007;

class CarrotJumping {
	public:
	int theJump(int init)
	{
		int t=100001,c=init;
		rep(i,100001)
		{
			if(c==0)t=min(t,i);
			if(((ll)c*4+3)%MOD==0)t=min(t,i+1);
			if(((ll)c*16+15)%MOD==0)t=min(t,i+2);
			
			c=((ll)c*8+7)%MOD;
			
		}
		return t<=100000?t:-1;
	}
};