結果
| 問題 | No.2075 GCD Subsequence |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2024-08-31 02:58:04 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 1,827 ms / 4,000 ms |
| コード長 | 1,848 bytes |
| 記録 | |
| コンパイル時間 | 504 ms |
| コンパイル使用メモリ | 82,292 KB |
| 実行使用メモリ | 258,584 KB |
| 最終ジャッジ日時 | 2024-08-31 02:58:29 |
| 合計ジャッジ時間 | 23,923 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 28 |
ソースコード
## https://yukicoder.me/problems/no/2075
MOD = 998244353
def main():
N = int(input())
A = list(map(int, input().split()))
# osa-k法による素因数となる素数を列挙
max_a = max(A)
if max_a == 1:
print(N)
return
primes = [p for p in range(max_a + 1)]
for p in range(2, max_a + 1):
if primes[p] != p:
continue
x = 2 * p
while x <= max_a:
primes[x] = min(primes[x], p)
x += p
p_divisors = []
p_divisors2 = []
for i in range(N):
a = A[i]
p_list = []
while primes[a] != 1:
if len(p_list) == 0 or p_list[-1] != primes[a]:
p_list.append(primes[a])
a //= primes[a]
p_d_len = len(p_list)
array = []
array2 = []
for p_bit in range(1, 2 ** p_d_len):
bit_count = 0
a = 1
for j in range(p_d_len):
if p_bit & (1 << j) > 0:
a *= p_list[j]
bit_count += 1
if bit_count % 2 == 1:
array.append(a)
else:
array2.append(a)
p_divisors.append(array)
p_divisors2.append(array2)
# dpを使う
primes_sum = [0] * (max_a + 1)
answer = 0
for i in range(N):
ans = 1
for a in p_divisors[i]:
ans += primes_sum[a]
ans %= MOD
for a in p_divisors2[i]:
ans -= primes_sum[a]
ans %= MOD
answer += ans
answer %= MOD
for a in p_divisors[i]:
primes_sum[a] += ans
primes_sum[a] %= MOD
for a in p_divisors2[i]:
primes_sum[a] += ans
primes_sum[a] %= MOD
print(answer)
if __name__ == "__main__":
main()