問題
解法
素因数分解してみる
かつ 100以下の最大の素数は97より、
を素因数分解すると、
のように素数のべき乗の積で表せます。
ここで、
は0以上の整数です。
の約数は、整数の組
を用いて、
のように素数のべき乗の積で表されます。
七五数を満たすパターン
さて、約数をちょうど75個持つ の約数について、
はどのような整数の組になるでしょうか。
まず、
の約数の個数は
です。
また、75をいくつかの数の積で表すと
となります(順序が異なるものは省略)。
したがって、
が以下のいずれかのパターンを成す場合に、約数をちょうど75個持ちます。
- パターン1:
- パターン2:
- パターン3:
- パターン4:
パターン1の個数
パターン1を満たす の組数は、
のうち、74以上である値の個数です。
パターン2の個数
パターン2を満たす の組数は、以下の積です。
のうち、24以上である値の個数
- (
のうち、2以上である値の個数) - 1
パターン3の個数
パターン3を満たす の組数は、以下の積です。
のうち、14以上である値の個数
- (
のうち、4以上である値の個数) - 1
パターン4の個数
パターン4を満たす の組数は、以下の積です。
- (
のうち、4以上である値の個数 * ((
のうち、4以上である値の個数) - 1)) / 2
- 4以上のpを2つ選ぶ組み合わせです
- (
のうち、2以上である値の個数) - 2
求める解
パターン1, 2, 3, 4の個数の和が求める解です。
ACしたコード
N = int(input()) p = [ sum(N // (i**k) for k in range(1, 8)) for i in range(2, 97 + 1) if all(i % j != 0 for j in range(2, i)) ] def f(m): return len([i for i in p if i >= m]) ans = f(74) + f(24) * (f(2) - 1) + f(14) * (f(4) - 1) + f(4) * (f(4) - 1) * (f(2) - 2) // 2 print(ans)