典型90【075 – Magic For Balls(★3)】をpython解説

Python

AtCoder の問題を解くために必要な実力を付けるために作られた「典型問題」を解いていく企画として、「典型90」があります。

今回は、その内、の75問目である「075 – Magic For Balls(★3)」を解説していきたいと思います。
なにか、間違っているところなどありましたら、@EitaSugiまで、ご指導ご鞭撻の程、よろしくお願い致します!

問題名 【075 – Magic For Balls(★3)】

問題

問題概要

整数 \(x\) が書かれたボールがあり、そのボールを叩くことで特定の操作が行われます。目的は、整数 \(N\) が書かれたボールを叩いて、すべてのボールに書かれている数を素数にすることです。このとき、最小で何回の操作を行う必要があるのかを求める問題です。

考察

整数 \(x\) を叩くと、 \(x\) が素数でない場合、 \(x\) を2つの因数 \(a\) と \(b\) に分けることができます。この操作を繰り返すことで、最終的にすべてのボールに書かれている数を素数にすることが目的です。

この操作の特徴として、最大の因数の数は \(2^{\text{作業回数}}\) となります。これは、1回の操作でボールの数が最大2倍になるためです。

したがって、最初に整数 \(N\) の因数の数を求め、その因数の数が \(2^{\text{作業回数}}\) 以下となる最小の作業回数を求めることで、答えを得ることができます。

因数となる\(a\), は必ず\(\sqrt{N}\)以下ですので、探索する範囲は\(O(\sqrt{N})\)ですので、十分高速に答えが求まります。

コード

def tameshi(n):
  ret = []
  for i in range(2, int(n ** (1 / 2)) + 1):
    if i > n:break
    while n % i == 0:
      n //= i
      ret.append(i)
  if n != 1:
    ret.append(n)
  return ret

n = int(input())
prime_cnt = len(tameshi(n))

cnt = 0
while True:
    if 2**(cnt) >= prime_cnt:
        print(cnt)
        break
    else:
        cnt += 1

まとめ

前の問題【072 – Loop Railway Plan(★4)】
次の問題【】

コメント

タイトルとURLをコピーしました