2012年1月17日火曜日

TopCoder 529 過去問


卒論が終わりました。CS関連に全力注入出来るのがうれしいです。早速SRM 529 の過去問を解きました。

今回から、やるだけの問題は載せません。面白くないので。

Div2 Hard

MinskyMistery Div2

マーブルに関するゲームを行うというもの。
ゲームの詳細を書くのは面倒くさいので割愛。
この問題は、与えられたN(>=2)に関する約数のうち、1を除く最小のものと最大のものを足したものを出力する問題に帰着出来る。ちなみに素数の場合は例外で、自身と1を足したものを返す。
N<2の時はループが終了しない。
なので気付いてしまえば瞬殺。

コード


#include <algorithm>
#include <iostream>
#include <map>
#include <numeric>
#include <set>
#include <sstream>
#include <string>
#include <vector>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <stack>
#include <deque>
#include <queue>
#include <functional>

using namespace std;

#define REP(i,s,e) for (int i = int(s); i != int(e); i++)
#define rep(i,e) REP(i,0,e)
#define foreach(i,c) for (typeof((c).begin()) i = (c).begin(); i != (c).end(); i++)
#define ALL(c) ((c).begin(), (c).end())
#define ll long long
#define VI vector<int>

class MinskyMysteryDiv2 {

 public:

 long long computeAnswer(long long N) {
  if(N < 2) return -1;
  for(ll i = 2;i*i <= N;i++) if(N%i == 0) return i + N/i;
  return N+1;
 }

};