C-merのブログ

ザ・雑記

SRM 517 Div 1 - Problem 250 CompositeSmash

お久しぶりです.

問題
SRM 517 Div 1 - Problem 250 CompositeSmash
TopCoder Statistics - Problem Statement

使用言語
C++

問題概要
Nを任意の回数(0回でも良い)分割して,targetに(どちらかの整数が)一致したらYes,一致しなければNoを返す.
分割とは,整数xを分割するとき,2以上のy,zに分割され,それらの積はxになる.


方針
・任意の回数→再帰
再帰の中身
  数値がtargetと一致→Yes
  それ以外→全ての分割した数字の組みについてtargetと一致するか判定or更に分割

所感
・動かしたら動いたのでよかった.

コード

bool smash (int a, int b)
{
  if (a == b) {
    return true;
  } else {
    //flag: 素数じゃないか(分割できるか)判定
    //rtn: 全ての分割した結果がtargetに行き着くかを返す
    bool flag = false, rtn = true;
    for (int i = 2; i * i <= a; i++) {
      if (a % i != 0) continue;
      else {
        flag = true;
        rtn = rtn & (smash(i,b) | smash(a/i,b));
      }
    }
    if (flag) return rtn;
    else return false;
  }
}

class CompositeSmash {
    public:
    string thePossible(int N, int target) {
      if (smash(N, target)) return "Yes";
      else return "No";
    }
};