結果
| 問題 | No.2075 GCD Subsequence | 
| コンテスト | |
| ユーザー |  lam6er | 
| 提出日時 | 2025-04-16 00:12:39 | 
| 言語 | PyPy3 (7.3.15) | 
| 結果 | 
                                TLE
                                 
                             | 
| 実行時間 | - | 
| コード長 | 2,072 bytes | 
| コンパイル時間 | 277 ms | 
| コンパイル使用メモリ | 81,624 KB | 
| 実行使用メモリ | 120,264 KB | 
| 最終ジャッジ日時 | 2025-04-16 00:14:04 | 
| 合計ジャッジ時間 | 13,841 ms | 
| ジャッジサーバーID (参考情報) | judge4 / judge3 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| 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()
            
            
            
        