結果

問題 No.1330 Multiply or Divide
ユーザー gew1fw
提出日時 2025-06-12 13:20:50
言語 PyPy3
(7.3.15)
結果
MLE  
実行時間 -
コード長 2,216 bytes
コンパイル時間 558 ms
コンパイル使用メモリ 82,416 KB
実行使用メモリ 723,912 KB
最終ジャッジ日時 2025-06-12 13:22:53
合計ジャッジ時間 4,598 ms
ジャッジサーバーID
(参考情報)
judge4 / judge1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other AC * 1 MLE * 1 -- * 44
権限があれば一括ダウンロードができます

ソースコード

diff #

import sys
import heapq

def main():
    N, M, P = map(int, sys.stdin.readline().split())
    A = list(map(int, sys.stdin.readline().split()))
    
    decomposed = []
    has_b_gt1 = False
    for a in A:
        k = 0
        while a % P == 0:
            a //= P
            k += 1
        b = a
        decomposed.append((k, b))
        if b > 1:
            has_b_gt1 = True
    
    if not has_b_gt1:
        # Check if any P^k_i > M
        found = False
        for k, b in decomposed:
            current = 1
            for _ in range(k):
                current *= P
                if current > M:
                    break
            if current > M:
                found = True
                break
        print(1 if found else -1)
        return
    
    # BFS with priority queue
    heap = []
    heapq.heappush(heap, (0, 1))
    visited = {1: 0}
    answer = -1
    
    while heap:
        steps, r = heapq.heappop(heap)
        if answer != -1 and steps >= answer:
            continue
        if visited.get(r, float('inf')) < steps:
            continue
        
        for k, b in decomposed:
            new_r = r * b
            X = new_r * (P ** k)
            if X > M:
                if answer == -1 or steps + 1 < answer:
                    answer = steps + 1
                continue
            
            # Compute s_min
            s = 0
            current = new_r
            while current <= M and s <= k:
                current *= P
                s += 1
            
            if s <= k:
                total_steps = steps + 1 + (k - s)
                if answer == -1 or total_steps < answer:
                    answer = total_steps
            else:
                if new_r > M:
                    total_steps = steps + 1 + k
                    if answer == -1 or total_steps < answer:
                        answer = total_steps
                else:
                    if new_r not in visited or steps + 1 + k < visited.get(new_r, float('inf')):
                        visited[new_r] = steps + 1 + k
                        heapq.heappush(heap, (steps + 1 + k, new_r))
    
    print(answer if answer != -1 else -1)

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