【競プロ典型90問】「030 - K Factors(★5)」解法
Free-PhotosによるPixabayからの画像

問題

030 - K Factors(★5)

ポイント

2以上N以下の整数の素因数の種類を全て求め、最後にK 種類以上の素因数を持つものの個数を
求めます。

方法としては2からNまで全探索していき、素数を見つける度にその素数で割り切れる
N以下の全ての整数の素因数の種類数を+1します。

以上を踏まえ、実装したコードがこちらです。

コード

def main():
    import sys
    sys.setrecursionlimit(10 ** 9)
    input = sys.stdin.readline

    N, K = map(int, input().split())

    # 各数の素因数の種類数を格納
    num_prime_factor = [0] * (N+1)
    for i in range(2, N+1):
        if num_prime_factor[i] != 0:  # 0じゃない = 素数じゃないので次のループへ
            continue

        for j in range(i, N+1, i):  # 素数を見つけたらN以下のその素数で割り切れる整数を確認する
            num_prime_factor[j] += 1  # 素因数の種類の数を+1する

    # K種類以上の素因数を持つものの個数をもとめる
    ans = 0
    for i in range(len(num_prime_factor)):
        if num_prime_factor[i] >= K:
            ans += 1

    print(ans)


if __name__ == '__main__':
    main()
おすすめの記事