結果
| 問題 |
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 |
ソースコード
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()
lam6er