trang chủ / đề bài / sosbasic

Tổng trên tập con (SOS DP)

Đề bài

Mô tả

Cho số nguyên N và mảng f[0],f[1],…,f[2N−1] gồm 2N số nguyên.

Với mỗi mask m thuộc {0,1,…,2N−1}, định nghĩa

g[m]=∑s⊆mf[s],

trong đó s⊆m có nghĩa là s&m=s (mọi bit của s đều nằm trong m). Cả m và 0 đều là tập con của m.

Hãy in ra dãy g[0],g[1],…,g[2N−1].

Dữ liệu vào

  • Dòng 1: số nguyên N.
  • Dòng 2: 2N số nguyên f[0],f[1],…,f[2N−1] cách nhau bởi dấu cách.

Dữ liệu ra

  • Gồm 2N dòng. Dòng thứ m+1 (tính từ 1) chứa giá trị g[m].

Ràng buộc

  • 1≤N≤20 (do đó 2N≤1048576).
  • −109≤f[m]≤109.
  • |g[m]|≤220·109≈1015, vừa khít kiểu nguyên 64-bit có dấu.

Ví dụ

Input Output Giải thích
2
1 2 3 4
1
3
4
10
Với N=2 ta có 4 mask. g[0]=f[0]=1. g[1]=f[0]+f[1]=3 (tập con của 012 là 002 và 012). g[2]=f[0]+f[2]=4. g[3]=f[0]+f[1]+f[2]+f[3]=10.
3
1 1 1 1 1 1 1 1
1
2
2
4
2
4
4
8
Khi mọi f[s]=1 thì g[m]=2popcount(m) — đúng bằng số tập con của m.

Ghi chú

Cách làm ngây thơ duyệt mọi cặp (m,s) với s⊆m tốn O(3N) (≈3.5·109 khi N=20) và không kịp thời gian. Bài toán có một cách giải kinh điển chạy trong O(N·2N).

Bình luận

Không có bình luận tại thời điểm này.

gnatmake 12.2.0 a68g 3.1.2 nasm 2.16.1 as_x64 2.47 awk 1.3.4 gcc 16.2.0 dotnet 10.0.402 g++ 16.2.0 g++-themis 16.2.0 g++17 16.2.0 g++20 16.2.0 g++23 16.2.0 clang++ 22.1.8 dmd 2.113.0 dart 3.13.6 gforth 0.7.3 gfortran 15.3.0 go 1.27.3 groovyc 5.1.3 javac 26.0.2.1 node 26.12.1 julia 1.13.2 kotlinc 2.4.21 lean 4.35.0 sbcl 2.2.9 lua 5.5.1 nim 2.2.12 fpc 3.2.2 fpc-themis 3.2.2 perl 5.42.3 php 8.5.12 pike 8.0 swipl 9.0.4 pypy3 7.3.23 python3 3.15.1 racket 8.7 ruby 4.0.8 rustc 1.99.1 csc 5.3.0 ctoj-scratch 0.0.1 sed 4.9 swiftc 6.4.1 tclsh 8.6 bun 1.4.4 deno 2.9.8 v 0.5.2 zig 0.17.0