けんちょんの競プロ精進記録

競プロの精進記録や小ネタを書いていきます

AtCoder ABC 324 B - 3-smooth Numbers (灰色, 200 点)

数学的な問題。

問題概要

正の整数  N が与えられる。0 以上の整数  x, y であって、

 N = 2^{x} 3^{y}

となるものが存在するかどうかを判定せよ。

制約

  •  1 \le N \le 10^{18}

考えたこと

問題を解くときに、条件をわかりやすく言い換えていくことはとても大事!

今回は次のように考えるとわかりやすい。 N を 2 で割れるだけ割って、3 で割れるだけ割って、1 になれば Yes と考えるのだ。たとえば

  •  N = 288 = 2^{5} \times 3^{2} のとき、2, 3 で割れるだけ割ると  N = 1 になるので Yes
  •  N = 120 = 2^{3} \times 3 \times 5 のとき、2, 3 で割れるだけ割っても  N = 5 が残るので No

というようになる。

コード

while 文を使うと実装しやすい。

#include <bits/stdc++.h>
using namespace std;

int main() {
    long long N;
    cin >> N;
    while (N % 2 == 0) N /= 2;
    while (N % 3 == 0) N /= 3;
    
    if (N == 1) cout << "Yes" << endl;
    else cout << "No" << endl;
}