結果
問題 | No.1463 Hungry Kanten |
ユーザー |
|
提出日時 | 2025-03-28 23:33:00 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 1,117 ms / 2,000 ms |
コード長 | 2,041 bytes |
コンパイル時間 | 162 ms |
コンパイル使用メモリ | 82,060 KB |
実行使用メモリ | 226,428 KB |
最終ジャッジ日時 | 2025-06-20 02:28:51 |
合計ジャッジ時間 | 5,636 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 24 |
ソースコード
## https://yukicoder.me/problems/no/737 import math def main(): N, K = map(int, input().split()) A = list(map(int, input().split())) # aの素因子として含まれる素数の列挙 prime_set = set() for a in A: sqrt_a = int(math.sqrt(a)) for p in range(2, sqrt_a + 1): if a % p == 0: while a % p == 0: a //= p prime_set.add(p) if a > 1: prime_set.add(a) base_primes = list(prime_set) base_primes.sort() # a をベクトル化してみる vec_a = [] for a in A: base_array = [0] * len(base_primes) for i, p in enumerate(base_primes): if a % p == 0: cnt = 0 while a % p == 0: cnt += 1 a //= p base_array[i] = cnt vec_a.append(tuple(base_array)) # 総積の組み合わせ answer_set = set() for bit in range(2 ** N): k = 0 for i in range(N): if bit & (1 << i) > 0: k += 1 if k < K: continue answer_vec = [0] * len(base_primes) for i in range(N): if bit & (1 << i) > 0: for j in range(len(base_primes)): answer_vec[j] += vec_a[i][j] answer_set.add(tuple(answer_vec)) # 総和の組み合わせ for bit in range(2 ** N): k = 0 ans = 0 for i in range(N): if bit & (1 << i) > 0: k += 1 ans += A[i] if k < K: continue vec = [0] * len(base_primes) for j, p in enumerate(base_primes): cnt = 0 while ans % p == 0: ans //= p cnt += 1 vec[j] = cnt if ans > 1: vec.append(ans) vec = tuple(vec) answer_set.add(vec) print(len(answer_set)) if __name__ == "__main__": main()