結果
| 問題 |
No.2075 GCD Subsequence
|
| コンテスト | |
| ユーザー |
lam6er
|
| 提出日時 | 2025-04-16 00:48:56 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 1,759 ms / 4,000 ms |
| コード長 | 1,852 bytes |
| コンパイル時間 | 323 ms |
| コンパイル使用メモリ | 82,652 KB |
| 実行使用メモリ | 132,960 KB |
| 最終ジャッジ日時 | 2025-04-16 00:51:51 |
| 合計ジャッジ時間 | 23,577 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 28 |
ソースコード
import sys
from sys import stdin
from collections import defaultdict
MOD = 998244353
def main():
max_A = 10**6
min_prime = [0] * (max_A + 1)
for i in range(2, max_A + 1):
if min_prime[i] == 0:
min_prime[i] = i
if i * i <= max_A:
for j in range(i * i, max_A + 1, i):
if min_prime[j] == 0:
min_prime[j] = i
# Handle cases where i is a prime number but not marked due to the loop conditions
for i in range(2, max_A + 1):
if min_prime[i] == 0:
min_prime[i] = i
def get_primes(n):
primes = set()
if n == 1:
return primes
while n > 1:
p = min_prime[n]
primes.add(p)
while n % p == 0:
n = n // p
return primes
input = sys.stdin.read().split()
n = int(input[0])
A = list(map(int, input[1:n+1]))
ans = 0
cnt = defaultdict(int)
for a in A:
if a == 1:
ans = (ans + 1) % MOD
continue
primes = get_primes(a)
if not primes:
ans = (ans + 1) % MOD
continue
primes = list(primes)
k = len(primes)
subsets = []
for mask in range(1, 1 << k):
product = 1
t = 0
for j in range(k):
if mask & (1 << j):
product *= primes[j]
t += 1
subsets.append((product, t))
sum_val = 0
for m, t in subsets:
sign = (-1) ** (t + 1)
sum_val = (sum_val + sign * cnt[m]) % MOD
current = (sum_val + 1) % MOD
ans = (ans + current) % MOD
for m, t in subsets:
cnt[m] = (cnt[m] + current) % MOD
print(ans % MOD)
if __name__ == "__main__":
main()
lam6er