結果
問題 | No.2075 GCD Subsequence |
ユーザー |
![]() |
提出日時 | 2025-04-16 16:24:22 |
言語 | PyPy3 (7.3.15) |
結果 |
TLE
|
実行時間 | - |
コード長 | 2,072 bytes |
コンパイル時間 | 153 ms |
コンパイル使用メモリ | 81,404 KB |
実行使用メモリ | 128,336 KB |
最終ジャッジ日時 | 2025-04-16 16:25:15 |
合計ジャッジ時間 | 14,343 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 15 TLE * 1 -- * 12 |
ソースコード
import sys MOD = 998244353 def main(): max_num = 10**6 spf = list(range(max_num + 1)) for i in range(2, int(max_num**0.5) + 1): if spf[i] == i: for j in range(i*i, max_num + 1, i): if spf[j] == j: spf[j] = i n = int(sys.stdin.readline()) a = list(map(int, sys.stdin.readline().split())) max_m = 10**6 sum_d = [0] * (max_m + 2) answer = 0 for num in a: if num == 1: dp_i = 1 divisors = [] else: factors = {} x = num while x > 1: p = spf[x] while x % p == 0: factors[p] = factors.get(p, 0) + 1 x //= p primes = list(factors.keys()) k = len(primes) sum_shared = 0 for mask in range(1, 1 << k): bits = bin(mask).count('1') m = 1 for i in range(k): if mask & (1 << i): m *= primes[i] sign = (-1) ** (bits + 1) term = sum_d[m] * sign sum_shared += term if sum_shared >= MOD or sum_shared <= -MOD: sum_shared %= MOD sum_shared %= MOD dp_i = (1 + sum_shared) % MOD divisors = [1] for p in factors: exponents = factors[p] temp = [] for d in divisors: current = d for _ in range(exponents): current *= p temp.append(current) divisors += temp divisors = list(set(divisors)) if 1 in divisors: divisors.remove(1) divisors = [d for d in divisors if d != 1] for d in divisors: if d <= max_m: sum_d[d] = (sum_d[d] + dp_i) % MOD answer = (answer + dp_i) % MOD print(answer % MOD) if __name__ == "__main__": main()