結果

問題 No.375 立方体のN等分 (1)
ユーザー lam6er
提出日時 2025-03-31 17:27:48
言語 PyPy3
(7.3.15)
結果
WA  
実行時間 -
コード長 1,988 bytes
コンパイル時間 237 ms
コンパイル使用メモリ 82,432 KB
実行使用メモリ 77,788 KB
最終ジャッジ日時 2025-03-31 17:27:53
合計ジャッジ時間 3,407 ms
ジャッジサーバーID
(参考情報)
judge1 / judge3
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 2
other AC * 29 WA * 3
権限があれば一括ダウンロードができます

ソースコード

diff #

import math

def factorize(n):
    factors = {}
    while n % 2 == 0:
        factors[2] = factors.get(2, 0) + 1
        n = n // 2
    i = 3
    max_i = int(math.isqrt(n)) + 1
    while i <= max_i and n > 1:
        while n % i == 0:
            factors[i] = factors.get(i, 0) + 1
            n = n // i
            max_i = int(math.isqrt(n)) + 1
        i += 2
    if n > 1:
        factors[n] = 1
    return factors

def generate_divisors(factors):
    divisors = [1]
    for p in factors:
        exp = factors[p]
        current_divisors = divisors.copy()
        divisors = []
        for d in current_divisors:
            for e in range(exp + 1):
                divisors.append(d * (p ** e))
        divisors = list(set(divisors))
        divisors.sort()
    return sorted(divisors)

def find_min_triple(N):
    if N == 1:
        return 0
    factors_N = factorize(N)
    divisors_N = generate_divisors(factors_N)
    cube_root = N ** (1/3)
    a_candidates = [a for a in divisors_N if a <= cube_root]
    min_sum = float('inf')
    for a in a_candidates:
        M = N // a
        if a * (M) != N:
            continue
        factors_a = factorize(a)
        factors_M = {}
        for p in factors_N:
            exp_in_N = factors_N[p]
            exp_in_a = factors_a.get(p, 0)
            exp_in_M = exp_in_N - exp_in_a
            if exp_in_M > 0:
                factors_M[p] = exp_in_M
        divisors_M = generate_divisors(factors_M)
        sqrt_M = math.isqrt(M)
        for b in divisors_M:
            if b < a or b > sqrt_M:
                continue
            c = M // b
            if c < b:
                continue
            current_sum = a + b + c
            if current_sum < min_sum:
                min_sum = current_sum
    return min_sum - 3

def main():
    N = int(input().strip())
    if N == 1:
        print("0 0")
        return
    Tmin = find_min_triple(N)
    Tmax = N - 1
    print(f"{Tmin} {Tmax}")

if __name__ == "__main__":
    main()
0