題意:給定n
nn個數k
ik_i
ki,從中選取任意個(可以為0
00)進行異或得到ans
ansan
s,問有多少種ans
≥m
ans\geq m
ans≥m。
資料範圍:1≤n
≤40,0
≤ki≤
106,
m≤10
61\leq n \leq 40, 0\leq k_i\leq 10^6,m\leq 10^6
1≤n≤40
,0≤k
i≤1
06,m
≤106
題解:
f [i
][j]
f[i][j]
f[i][j
]表示選前i
ii個數得到異或結果為j
jj的數量,狀態轉移為為f[i
][j]
=f[i
−1][
j]+f
[i−1
][j∧
ki
]f[i][j]=f[i-1][j]+f[i-1][j \wedge k_i]
f[i][j
]=f[
i−1]
[j]+
f[i−
1][j
∧ki
]由於只與前乙個狀態有關,所以仍然可以用模2
22來進行當前狀態和上一狀態的區分。
**:
#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace std;
inline
intread()
while
(ch >=
'0'&& ch <=
'9')
return x * f;
}const
int n =40+
10, m =
1<<20;
int f[2]
[m];
long
long
solve()
long
long res =
1ll<< n;
for(
int j =
0; j < m;
++j) res -
= f[n &1]
[j];
return res;
}int
main()
return0;
}
hdu 5119 滾動陣列dp
題意 現在乙個人有n個朋友,它的每個朋友都有乙個值,它每次可以選擇一些朋友的值然後將它們異或起來,如果最後的異或和大於等於m的話,那麼這個人就贏了。問,這個人有幾種贏的方法。思路 求有幾種方法的題目都可以用dp來思考。dp i j 前i個人異或和為j有幾種方法。由於直接開40個人會mle,所以只能用...
hdu 5119 和》 m情況數 dp
給一n元數列,求異或和 m的情況數 dp i j 表示由前i個數組成異或和為j的方法數,每次先獲得不異或當前b i 的情況數,加上異或了b i 的情況數即可。dp 0 0 1,其他為0 5s險過.include include include include include include incl...
hdu 1024 滾動陣列優化
本題的大致意思為給定乙個陣列,求其分成 m個不相交子段和最大值的問題。解題思路 dp i j 表示前j個數分成i組,且j在第i組裡的最大值。dp i j max,前乙個表示j與j 1在i組裡,後乙個表示j單獨成組。但這道題的n很大,空間複雜度太高,所以要用滾動陣列。max dp i 1 k 就是上一...