[ARC164] A - Ternary Decomposition

[Q] https://atcoder.jp/contests/arc164/tasks/arc164_a

考察
・Nをできるだけ大きい数で分解する。
・3^39 = 4,052,555,153,018,976,267 > 1e18
なので、3^39から3^0まで分解して、最小の分解数Xを求める。
・分解した要素について。
3 = 1 + 1 + 1と分解すれば、分解数を2つ増やせる。任意に2ずつ増やせる。
・KがX+2の倍数で表せるならYes。

N = 26を考える。

N = 9 + 9 + 3 + 3 + 1 + 1
の6要素に分けられる。

これは、9 = 3 + 3 + 3にすれば、
N = 9 + (3 + 3 + 3) + 3 + 3 + 1 + 1
の8要素に分けられる。

ほかにも、3 = (1 + 1 + 1)にすれば、
N = 9 + (3 + 3 + 3) + 3 + (1 + 1 + 1) + 1 + 1
の10要素に分けられる。

最も少ない分解数がわかったら、+2ずつバリエーションをもたせられることがわかった。

実装

int main() {
  cincout();

  ll T;
  cin >> T;
  ll pow3[100]{};
  pow3[0] = 1;
  rep(i, 39) { pow3[i + 1] = pow3[i] * 3; }
  while (T--) {
    ll N, K;
    cin >> N >> K;

    ll cnt = 0; // 最小の分解要素数
    ll n = N;
    ll dis = 39;
    while (n > 0) {
      while (pow3[dis] > n) --dis;
      cnt += n / pow3[dis];
      n %= pow3[dis];
    }
    if (cnt <= K && ((K - cnt) % 2 == 0)) { 分解要素数に、任意に2を足したときにKになるか
      cout << "Yes" << endl;
    } else
      cout << "No" << endl;
  }
}

https://atcoder.jp/contests/arc164/submissions/43419646


いいなと思ったら応援しよう!