Hatena::Grouptopcoder

kojingharangの日記 RSSフィード

 | 

2012-01-15

SMR 529 Div2 hard MinskyMysteryDiv2

11:24 |  SMR 529 Div2 hard MinskyMysteryDiv2 - kojingharangの日記 を含むブックマーク はてなブックマーク -  SMR 529 Div2 hard MinskyMysteryDiv2 - kojingharangの日記  SMR 529 Div2 hard MinskyMysteryDiv2 - kojingharangの日記 のブックマークコメント

与えられた手順があるので、停止するかどうかと停止したときの変数の値を求める問題。

40分くらい紙の上で考えたけど最適化できず。あとから考えるとコードを動かしながら考えれば良かった。。

(あとで)

bag0 bag1の大小で分けると、bag0 < bag1なら停止しない、そうでなければ bag0%bag1==0なら停止して bag1+bag0/bag1 が答え。

割り切れない場合は、bag0=bag2 のとこで実際にいくつか出力してみると bag0 は元々の bag0 と同じになりそうということがわかったので

bag2 関連は無視してよくて(ここがポイントっぽい)、bag1 は 1 ずつ増えて行って bag0==bag1 になったら bag0%bag1==0 になるので停止するので bag0%bag1 != 0 の場合もいずれ停止する。

というわけで N<2 なら -1, そうでなければ N の最初の約数 i に対して i+N/i を返せばよい。

O(sqrt(N)) なので 10^12 でもOK.

(あとで通したもの)

class MinskyMysteryDiv2 {
	public:
	long long computeAnswer(long long N) {
		if(N<2) return -1;
		if(N%2==0) return 2+N/2;
		for(ll i=3;i*i<=N;i+=2) {
			if(N%i==0) return i+N/i;
		}
		return N+1;
	}
 |