ホームに戻る
対決問題

// 0 と 1 が勝負をする。
// 0 が先手で n から 1,2,3 のいずれかを引く
// 自分の番で 0 になった場合負けである。
// n == 0 であれば先手の 0 が引けないので 1 の勝ち。
// n == 1 であれば先手の 0 が 1 引けば勝てる。

// 最初にすべてに -1 を入れておく。
int memo[1000001][2];

int f(int n,int c){
  if(n <= 0){
    return 1-c;
  }
  
  if(memo[n][c] != -1){
    return memo[n][c];
  }
  
  // 0
  if(c == 0){
    int ret = 1;
    ret &= f(n-1, 1-c);
    ret &= f(n-2, 1-c);
    ret &= f(n-3, 1-c);
    return memo[n][c] = ret;
  }
  // 1
  else{
    int ret = 0;
    ret |= f(n-1, 1-c);
    ret |= f(n-2, 1-c);
    ret |= f(n-3, 1-c);
    return memo[n][c] = ret;
  }
}

inserted by FC2 system