与えられた手順があるので、停止するかどうかと停止したときの変数の値を求める問題。
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; }