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"; } };