結果

問題 No.811 約数の個数の最大化
ユーザー stngstng
提出日時 2022-07-06 16:14:18
言語 PyPy3
(7.3.15)
結果
WA  
実行時間 -
コード長 1,636 bytes
コンパイル時間 250 ms
コンパイル使用メモリ 81,976 KB
実行使用メモリ 64,440 KB
最終ジャッジ日時 2024-06-02 02:45:19
合計ジャッジ時間 1,403 ms
ジャッジサーバーID
(参考情報)
judge5 / judge4
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 36 ms
52,940 KB
testcase_01 AC 40 ms
59,172 KB
testcase_02 AC 47 ms
64,440 KB
testcase_03 AC 33 ms
53,276 KB
testcase_04 AC 36 ms
54,320 KB
testcase_05 WA -
testcase_06 WA -
testcase_07 AC 41 ms
61,436 KB
testcase_08 WA -
testcase_09 WA -
testcase_10 WA -
testcase_11 WA -
testcase_12 WA -
testcase_13 WA -
testcase_14 AC 44 ms
64,240 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

import math
import bisect

def sieve_of_eratosthenes(n):
    prime = [True for i in range(n+1)]
    prime[0] = False
    prime[1] = False

    sqrt_n = math.ceil(math.sqrt(n))
    for i in range(2, sqrt_n):
        if prime[i]:
            for j in range(2*i, n+1, i):
                prime[j] = False

    return prime

# 素因数分解、辞書で返すやつ
# mathをimportする
def prime(n):
    factor = {}
    tmp = int(math.sqrt(n)) + 1
    for num in range(2, tmp):
        while n % num == 0:
            n //= num
            if not num in factor.keys():
                factor[num] = 1
            else:
                factor[num] += 1
        if num > n:
            break
    if n != 1:
        if not n in factor.keys():
            factor[n] = 1
        else:
            factor[n] += 1
    return factor

n,k = map(int,input().split())

dic = {}
pr = prime(n)
for num, count in pr.items():
    if not num in dic.keys():
        dic[num] = count
    else:
        if dic[num] < count:
            dic[num] = count

ans = 1
cnt = k

li = sieve_of_eratosthenes(n)
ss = {}
for p in range(n+1):
    if li[p]:
        ss[p] = 0

while cnt > 0:
    for num,count in dic.items():
        if cnt == 0:
            break
        if count == 0:
            continue
        else:
            dic[num] -= 1
        ss[num] += 1
        cnt -= 1
        ans *= num

useli = [[] for i in range(21)]

for num,count in ss.items():
    useli[count].append(num)

for i in range(21):
    for j in useli[i]:
        if ans * j < n:
            ans *= j
            bisect.insort(useli[i+1],j)
        else:
            break

print(ans)
0