結果
| 問題 |
No.1753 Don't cheat.
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2021-11-19 22:03:56 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 2,433 ms / 3,000 ms |
| コード長 | 2,406 bytes |
| コンパイル時間 | 231 ms |
| コンパイル使用メモリ | 82,452 KB |
| 実行使用メモリ | 85,560 KB |
| 最終ジャッジ日時 | 2025-01-01 17:48:57 |
| 合計ジャッジ時間 | 80,630 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 30 |
ソースコード
N = 2*10**5
mod = 998244353
g1 = [1]*(N+1) # 元テーブル
g2 = [1]*(N+1) #逆元テーブル
inverse = [1]*(N+1) #逆元テーブル計算用テーブル
for i in range( 2, N + 1 ):
g1[i]=( ( g1[i-1] * i ) % mod )
inverse[i]=( ( -inverse[mod % i] * (mod//i) ) % mod )
g2[i]=( (g2[i-1] * inverse[i]) % mod )
inverse[0]=0
def cmb(n, r, mod):
if ( r<0 or r>n ):
return 0
r = min(r, n-r)
return g1[n] * g2[r] * g2[n-r] % mod
def fwt(n,A):
assert len(A) == 2**n
for i in range(n):
t = 2**i
for j in range(2**n):
if j&t==0:
A[j] += A[j|t]
return A
def ifwt(n,A):
assert len(A) == 2**n
for i in range(n):
t = 2**i
for j in range(2**n):
if j&t==0:
A[j] -= A[j|t]
return A
inv = pow(1024,mod-2,mod)
def _fourier(f, inverse = False):
f = f[:]
n = (len(f) - 1).bit_length()
for d in range(n):
for U in range(1 << n):
if not U >> d & 1:
s, t = f[U], f[U | 1 << d]
f[U], f[U | 1 << d] = (s + t)%mod, (s - t)%mod
if inverse:
f = [v *inv % mod for v in f]
return f
def convolution(f, g):
return _fourier([a * b % mod for a, b in zip(_fourier(f), _fourier(g))], inverse = 1)
import sys,random,bisect
from collections import deque,defaultdict
from heapq import heapify,heappop,heappush
from itertools import permutations
from math import log,gcd
input = lambda :sys.stdin.readline()
mi = lambda :map(int,input().split())
li = lambda :list(mi())
N = int(input())
A = li()
S = sum(A)
P = [A[i]*pow(S,mod-2,mod)%mod for i in range(N+1)] + [0] * (1023-N)
res = P[0]
for i in range(1,1024):
f = [0] + [P[j] for j in range(1,1024)]
g = [f[j] for j in range(1024)]
g[i] = 0
af = _fourier(f)
ag = _fourier(g)
for j in range(1024):
af[j] = af[j] * pow(1-af[j],mod-2,mod) % mod
ag[j] = ag[j] * pow(1-ag[j],mod-2,mod) % mod
tmp = _fourier([af[i]-ag[i] for i in range(1024)],True)
#print(f,g)
#print([f[i]*30 % mod for i in range(4)])
res += P[0] * tmp[i] % mod
res %= mod
f = [0] + [P[j] for j in range(1,1024)]
af = _fourier(f)
for j in range(1024):
af[j] = af[j] * pow(1-af[j],mod-2,mod) % mod
ag[j] = ag[j] * pow(1-ag[j],mod-2,mod) % mod
f = _fourier(af,True)
res += P[0] * f[0] % mod
res %= mod
print((1-res)%mod)