結果
| 問題 |
No.1017 Reiwa Sequence
|
| ユーザー |
|
| 提出日時 | 2021-04-29 02:15:21 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 840 ms / 2,000 ms |
| コード長 | 1,276 bytes |
| コンパイル時間 | 319 ms |
| コンパイル使用メモリ | 82,560 KB |
| 実行使用メモリ | 226,816 KB |
| 最終ジャッジ日時 | 2024-07-08 01:22:16 |
| 合計ジャッジ時間 | 45,831 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 50 |
ソースコード
def zeta(A,merge):
"""
N=20程度まで
A = 2^N 通り のフラグの立ち方に対する値。これをゼータ変換で累積していく。
"""
_N = (len(A)-1).bit_length()
dp = A[:]
for k in range(_N):
bit=1<<k
for i in range(1<<_N):
if i&bit:
dp[i]=merge(dp[i^bit],dp[i])
return dp
def main():
used={}
for bit in range(1<<N):
s=S[bit]
if s==0:
continue
if s not in used:
used[s]=bit
else:
bit2=used[s]
for i in range(N):
cnt=0
if bit&(1<<i):
cnt+=1
if bit2&(1<<i):
cnt-=1
res[i]=cnt*AA[i]
return res
return -1
###############################################################################
import sys
input = sys.stdin.readline
N=int(input())
AA=list(map(int, input().split()))
res=[0]*N
if len(AA)>22:
AA=AA[:22]
N=22
A=[0]*(1<<N)
for i in range(len(AA)):
A[1<<i]=AA[i]
###################################
def merge(x,y):
return x+y
S=zeta(A,merge)
###################################
res=main()
if res==-1:
print("No")
else:
print("Yes")
print(*res)