結果
| 問題 |
No.2075 GCD Subsequence
|
| コンテスト | |
| ユーザー |
gew1fw
|
| 提出日時 | 2025-06-12 18:44:15 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 1,895 ms / 4,000 ms |
| コード長 | 1,838 bytes |
| コンパイル時間 | 409 ms |
| コンパイル使用メモリ | 82,280 KB |
| 実行使用メモリ | 134,860 KB |
| 最終ジャッジ日時 | 2025-06-12 18:44:44 |
| 合計ジャッジ時間 | 28,562 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 28 |
ソースコード
import sys
from sys import stdin
from collections import defaultdict
MOD = 998244353
def main():
# Precompute smallest prime factors (SPF) up to 1e6
max_a = 10**6
spf = list(range(max_a + 1))
for i in range(2, int(max_a**0.5) + 1):
if spf[i] == i:
for j in range(i*i, max_a + 1, i):
if spf[j] == j:
spf[j] = i
# Function to get distinct primes of x
def get_primes(x):
if x == 1:
return set()
primes = set()
while x != 1:
p = spf[x]
primes.add(p)
while x % p == 0:
x //= p
return primes
# Read input
input = sys.stdin.read().split()
n = int(input[0])
a = list(map(int, input[1:n+1]))
answer = 0
cnt = defaultdict(int)
for x in a:
if x == 1:
answer = (answer + 1) % MOD
continue
primes = get_primes(x)
if not primes:
answer = (answer + 1) % MOD
continue
primes = sorted(primes)
n_primes = len(primes)
subsets = []
for mask in range(1, 1 << n_primes):
product = 1
bits = 0
for i in range(n_primes):
if mask & (1 << i):
product *= primes[i]
bits += 1
subsets.append((product, bits))
# Compute s
s = 0
for product, bits in subsets:
sign = (-1) ** (bits + 1)
term = (sign * cnt.get(product, 0)) % MOD
s = (s + term) % MOD
dp_i = (s + 1) % MOD
answer = (answer + dp_i) % MOD
# Update cnt
for product, bits in subsets:
cnt[product] = (cnt[product] + dp_i) % MOD
print(answer % MOD)
if __name__ == "__main__":
main()
gew1fw