結果
問題 | No.2025 Select $k$-th Submultiset |
ユーザー | None |
提出日時 | 2022-07-24 02:54:53 |
言語 | PyPy3 (7.3.15) |
結果 |
TLE
(最新)
AC
(最初)
|
実行時間 | - |
コード長 | 4,034 bytes |
コンパイル時間 | 172 ms |
コンパイル使用メモリ | 82,432 KB |
実行使用メモリ | 209,924 KB |
最終ジャッジ日時 | 2024-07-05 23:50:30 |
合計ジャッジ時間 | 4,630 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 36 ms
58,880 KB |
testcase_01 | AC | 37 ms
53,760 KB |
testcase_02 | AC | 291 ms
82,828 KB |
testcase_03 | TLE | - |
testcase_04 | -- | - |
testcase_05 | -- | - |
testcase_06 | -- | - |
testcase_07 | -- | - |
testcase_08 | -- | - |
testcase_09 | -- | - |
testcase_10 | -- | - |
testcase_11 | -- | - |
testcase_12 | -- | - |
testcase_13 | -- | - |
testcase_14 | -- | - |
testcase_15 | -- | - |
testcase_16 | -- | - |
testcase_17 | -- | - |
testcase_18 | -- | - |
testcase_19 | -- | - |
testcase_20 | -- | - |
testcase_21 | -- | - |
testcase_22 | -- | - |
testcase_23 | -- | - |
testcase_24 | -- | - |
testcase_25 | -- | - |
testcase_26 | -- | - |
testcase_27 | -- | - |
testcase_28 | -- | - |
testcase_29 | -- | - |
testcase_30 | -- | - |
testcase_31 | -- | - |
testcase_32 | -- | - |
testcase_33 | -- | - |
testcase_34 | -- | - |
testcase_35 | -- | - |
testcase_36 | -- | - |
testcase_37 | -- | - |
testcase_38 | -- | - |
testcase_39 | -- | - |
testcase_40 | -- | - |
testcase_41 | -- | - |
testcase_42 | -- | - |
testcase_43 | -- | - |
testcase_44 | -- | - |
ソースコード
##################################################################################################### ##### 畳み込み ##################################################################################################### """ O(N log N) """ def gcd_inv(a, b): a %= b if a == 0: return b, 0 s = b t = a m0 = 0 m1 = 1 while t: u = s // t s -= t * u m0 -= m1 * u s, t = t, s m0, m1 = m1, m0 if m0 < 0: m0 += b // s return s, m0 def crt(Rs,MODs): """ Find solution s.t. x = R1 (MOD1) x = R2 (MOD2) x = R3 (MOD3) . . up to MOD=MOD1*MOD2*MOD3*.... """ assert len(Rs)==len(MODs) n = len(Rs) r0 = 0 m0 = 1 for i in range(n): assert 1<=MODs[i] r1 =Rs[i]%MODs[i] m1 = MODs[i] if m0 < m1: r0, r1 = r1, r0 m0, m1 = m1, m0 if m0 % m1 == 0: if r0 % m1 != r1: return 0, 0 continue g, im = gcd_inv(m0, m1) u1 = m1 // g if (r1 - r0) % g: return 0, 0 x = (r1 - r0) // g * im % u1 r0 += x * m0 m0 *= u1 if (r0 < 0): r0 += m0 return r0, m0 def ntt(A, n): for i in range(n): m = 1<<(n-i-1) for s in range(1<<i): w = 1 s *= m*2 for j in range(m): A[s+j], A[s+j+m] = (A[s+j]+A[s+j+m])%mod, (A[s+j]-A[s+j+m])*w%mod w *= roots[n-i] w %= mod def intt(A, n): for i in range(n): m = 1<<i for s in range(1<<(n-i-1)): w = 1 s *= m*2 for j in range(m): A[s+j], A[s+j+m] = (A[s+j]+A[s+j+m]*w)%mod, (A[s+j]-A[s+j+m]*w)%mod w *= inv_roots[i+1] w %= mod inv = pow((mod+1)//2, n, mod) for i in range(1<<n): A[i] *= inv A[i] %= mod def convolution(A, B): A=A[:] B=B[:] la = len(A) lb = len(B) deg = la + lb - 2 n = deg.bit_length() N = 1<<n A += [0]*(N-la) B += [0]*(N-lb) ntt(A, n) ntt(B, n) A = [a*b%mod for a, b in zip(A, B)] intt(A, n) return A[:deg+1] ####################################################################### def example(): global input example = iter( """ 6 10000 1000 2000 3000 4000 5000 6000 10 65769569579799458 42608972886666190 76184379495896651 37112714773176682 26896988026260061 64809455699325470 29169480516878400 87070971017458999 66497403686690100 18875969223705697 """ .strip().split("\n")) input = lambda: next(example) ####################################################################### import sys input = sys.stdin.readline from bisect import * # example() N,L=map(int, input().split()) C=list(map(int, input().split())) MODs = [167772161,469762049,998244353] tmp=[] for mod in MODs: primitive_root = 3 roots = [pow(primitive_root, (mod-1)>>i, mod) for i in range(24)] inv_roots = [pow(root, mod-2, mod) for root in roots] B=[1]+[0]*L CNT=[] for i in range(N)[::-1]: A=[1]*(C[i]+1) B = convolution(B, A) B = B[:L+1] CNT.append(B[::]) CNT=CNT[:-1] CNT.reverse() S=[[0]*(L+2) for _ in range(N-1)] for k in range(N-1): for i in range(L+1): # 自由パラメタの個数 S[k][i+1]+=S[k][i]+CNT[k][i] tmp.append(S) S=[[0]*(L+2) for _ in range(N-1)] for k in range(N-1): for i in range(L+2): S[k][i]=crt((tmp[0][k][i],tmp[1][k][i],tmp[2][k][i]),MODs)[0] Q=int(input()) for _ in range(Q): k=int(input()) res=[] l=L for p in range(N-1): i=bisect_left(S[p],k+S[p][max(l-C[p],0)])-1 # 自由パラメタ i個からi+1個のどこか k-=S[p][i]-S[p][max(l-C[p],0)] # print(i,k,l-i) res.append(l-i) l=i res.append(l) for i in range(N): if res[i]<0: print(-1) break else: print(*res)