笔记 Tricks Tricks Copy Page Copy as Markdown View as Markdown 2026/7/14 子集和问题 计算数组内元素能够组合出的所有子集和. cpp 1 2 3 4 5 bitset<N> bs; bs[0] = 1; for (int i = 0; i < n; i++) { bs |= bs << a[i]; } 其中 N 为所有子集和的最大值,bs[k]==1 表示 k 是子集和之一. 1~n 连续异或和 设 S(n)=1⊕2⊕3⊕⋯⊕nS(n) = 1 \oplus 2 \oplus 3 \oplus \cdots \oplus nS(n)=1⊕2⊕3⊕⋯⊕n ,则有: S(n)={n,n mod 4=01,n mod 4=1n+1,n mod 4=20,n mod 4=3 S(n) = \begin{cases} n, & n \bmod 4 = 0 \\ 1, & n \bmod 4 = 1 \\ n + 1, & n \bmod 4 = 2 \\ 0, & n \bmod 4 = 3 \end{cases} S(n)=⎩⎨⎧n,1,n+1,0,nmod4=0nmod4=1nmod4=2nmod4=3 cpp 1 2 3 4 5 6 ll xor_sum(ll n) { if (n % 4 == 0) return n; if (n % 4 == 1) return 1; if (n % 4 == 2) return n + 1; return 0; } 模意义下最大子段和三点最大夹角