結果
問題 |
No.1633 Sorting Integers (Multiple of 2^K)
|
ユーザー |
![]() |
提出日時 | 2025-04-24 12:32:09 |
言語 | PyPy3 (7.3.15) |
結果 |
MLE
|
実行時間 | - |
コード長 | 2,467 bytes |
コンパイル時間 | 180 ms |
コンパイル使用メモリ | 82,644 KB |
実行使用メモリ | 537,412 KB |
最終ジャッジ日時 | 2025-04-24 12:33:29 |
合計ジャッジ時間 | 5,639 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 20 MLE * 1 -- * 24 |
ソースコード
import sys from functools import lru_cache def main(): n = int(sys.stdin.readline()) c = list(map(int, sys.stdin.readline().split())) digits = [] for i in range(9): digits.extend([i+1] * c[i]) even_digits = [d for d in digits if d % 2 == 0] if not even_digits: print(0) return max_k = 0 # We need to check from high k down to 1 for k in range(40, 0, -1): mod = 1 << k # Precompute 10^p mod mod for each position p (0-based from left) # positions are 0 to n-1, exponent is 10^{n-1 - p} power_of_10 = [pow(10, (n-1 - p), mod) for p in range(n)] # We need to track the count of each digit used and the remainder # We'll use a memoization approach with the current remainder and counts # But since counts can be up to 14, we need a way to represent it efficiently # Let's use a tuple of counts for each digit (from 1 to 9) counts = c.copy() from collections import defaultdict # Memoization cache: (position, remainder, counts_tuple) -> boolean # But since counts can be large, we need a better way # Alternative approach: use a bitmask for counts (not feasible for 9 digits) # Instead, use a dictionary to memoize the state # We'll use a recursive approach with memoization memo = {} def backtrack(pos, rem, cnts): key = (pos, rem, tuple(cnts)) if key in memo: return memo[key] if pos == n: return rem == 0 # Try all possible digits for d in range(1, 10): if cnts[d-1] == 0: continue # Check if this digit can be placed at the current position # For the last position, it must be even if pos == n-1 and d % 2 != 0: continue new_cnts = cnts.copy() new_cnts[d-1] -= 1 contribution = (d * power_of_10[pos]) % mod new_rem = (rem + contribution) % mod if backtrack(pos + 1, new_rem, new_cnts): memo[key] = True return True memo[key] = False return False # Check if there's a valid arrangement if backtrack(0, 0, c.copy()): print(k) return print(0) if __name__ == '__main__': main()