結果
| 問題 |
No.2075 GCD Subsequence
|
| コンテスト | |
| ユーザー |
taiga0629kyopro
|
| 提出日時 | 2022-08-19 19:56:05 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
RE
|
| 実行時間 | - |
| コード長 | 3,148 bytes |
| コンパイル時間 | 230 ms |
| コンパイル使用メモリ | 82,048 KB |
| 実行使用メモリ | 132,608 KB |
| 最終ジャッジ日時 | 2024-10-08 11:46:59 |
| 合計ジャッジ時間 | 18,985 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | WA * 2 RE * 26 |
ソースコード
from random import shuffle,randrange
class primes():
def __init__(self, n):
self.prime_num = n
self.min_prime = [-1] * (self.prime_num + 1) # 2以上の自然数に対して最小の素因数を表す
self.min_prime[0] = 0
self.min_prime[1] = 1
i = 2
self.prime = []
self.memo_prifac = {}
while i <= self.prime_num:
if self.min_prime[i] == -1:
self.min_prime[i] = i
self.prime.append(i)
for j in self.prime:
if i * j > self.prime_num or j > self.min_prime[i]: break
self.min_prime[j * i] = j
i += 1
def prifac(self, n):
# 素因数分解した結果を返す
if n in self.memo_prifac:
return self.memo_prifac[n]
res = {}
x = n
while x > 1:
p = self.min_prime[x]
if p in res:
res[p] += 1
else:
res[p] = 1
x //= p
# self.memo_prifac[n] = res #場合によってはこの行を消すと高速化
return res
def divisors(self, n):
# 約数列挙 メモした方がいいかも
if n== 1: return [1]
prf = self.prifac(n)
keys = [key for key in prf]
def divsearch(i):
if i == len(keys) - 1:
return [keys[i] ** j for j in range(prf[keys[i]] + 1)]
else:
res = []
subres = divsearch(i + 1)
p = keys[i]
for j in range(prf[p] + 1):
for node in subres:
res.append(node * p ** j)
return res
return divsearch(0)
pri=primes(10**6+100)
u=[0]*(10**6+100)
u[1]=1
for x in range(2,10**6+10):
u[x]=1
d=pri.prifac(x)
for p in d:
if d[p]>=2:u[x]=0
u[x]*=-1
from math import gcd
mod=998244353
def naive(n,p):
ans=0
for bit in range(1,2**n):
x=[]
for i in range(n):
if (bit>>i)&1:x.append(p[i])
k=len(x)
flag=1
for i in range(k-1):
if gcd(x[i],x[i+1])==1:flag=0
ans+=flag
return ans%mod
def sol1(n,P):
p=[0]+P[:]
dp=[0]*(n+1)
for i in range(1,n+1):
res=0
for j in range(1,n+1):
if gcd(p[i],j)==1:res+=dp[j]
dp[p[i]]=sum(dp)+1-res
dp[p[i]]%=mod
return sum(dp)%mod
def sol2(n,P):
p=[0]+P[:]
dp=[0]*(n+1)
g=[0]*(n+1)
sumdp=0
for i in range(1,n+1):
f1=0
for m in pri.divisors(p[i]):
f1+=u[m]*g[m]
dp[p[i]]=sumdp+1-f1
dp[p[i]]%=mod
sumdp+=dp[p[i]]
sumdp%=mod
for m in pri.divisors(p[i]):
g[m]+=dp[p[i]]
g[m]%=mod
return sum(dp)%mod
n=int(input())
p=list(map(int,input().split()))
print(sol2(n,p))
cnt=0
while 0:
cnt+=1
print(cnt)
n=randrange(1,100)
p=[i+1 for i in range(n)]
shuffle(p)
#ansn=naive(n,p)
ans1=sol1(n,p)
ans2=sol2(n,p)
if ans1!=ans2:
print(n)
print(*p)
exit()
taiga0629kyopro