結果
問題 |
No.1515 Making Many Multiples
|
ユーザー |
![]() |
提出日時 | 2025-06-12 14:15:07 |
言語 | PyPy3 (7.3.15) |
結果 |
TLE
|
実行時間 | - |
コード長 | 1,920 bytes |
コンパイル時間 | 170 ms |
コンパイル使用メモリ | 82,212 KB |
実行使用メモリ | 335,448 KB |
最終ジャッジ日時 | 2025-06-12 14:15:20 |
合計ジャッジ時間 | 3,879 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | -- * 3 |
other | AC * 2 TLE * 1 -- * 25 |
ソースコード
def main(): import sys input = sys.stdin.read().split() idx = 0 N = int(input[idx]); idx +=1 K = int(input[idx]); idx +=1 X = int(input[idx]); idx +=1 Y = int(input[idx]); idx +=1 A = list(map(int, input[idx:idx+N])) x_mod = X % K y_mod = Y % K a = min(x_mod, y_mod) b = max(x_mod, y_mod) # Initialize DP dp = [ [-1 for _ in range(K)] for _ in range(K) ] dp[a][b] = 0 for num in A: c = num % K next_dp = [ [ -1 for _ in range(K)] for _ in range(K) ] for a_prev in range(K): for b_prev in range(a_prev, K): if dp[a_prev][b_prev] == -1: continue sum_three = (a_prev + b_prev + c) % K points = dp[a_prev][b_prev] if sum_three == 0: points += 1 # Option 1: keep a_prev and b_prev new_a = a_prev new_b = b_prev if next_dp[new_a][new_b] < points: next_dp[new_a][new_b] = points # Option 2: keep a_prev and c new_a2 = min(a_prev, c) new_b2 = max(a_prev, c) if next_dp[new_a2][new_b2] < points: next_dp[new_a2][new_b2] = points # Option 3: keep b_prev and c new_a3 = min(b_prev, c) new_b3 = max(b_prev, c) if next_dp[new_a3][new_b3] < points: next_dp[new_a3][new_b3] = points dp = next_dp max_points = -1 for a_row in range(K): for b_col in range(a_row, K): if dp[a_row][b_col] > max_points: max_points = dp[a_row][b_col] print(max_points if max_points != -1 else 0) if __name__ == '__main__': main()