题意:n个数,你可以从中选一些数,也可以不选,选出来的元素的异或和大于m时,则称满足情况。问满足情况的方案数为多少。
分析:本来以为是用什么特殊的数据结构来操作,没想到是dp,还好队友很强。
定义dp[i][j]为在前i个数里选一些数的异或和为j的方案数,边计算边统计,
#include <iostream> #include <cstdio> #include <cstring> typedef long long ll; const int maxn=(1<<20); using namespace std; int dp[45][maxn]; int a[45]; int main() { // freopen("da","r",stdin); int t; scanf("%d",&t); for(int kase=1;kase<=t;kase++){ ll ans=0; int n,m; memset(dp,0,sizeof(dp)); scanf("%d%d",&n,&m); for(int i=0;i<n;i++) scanf("%d",&a[i]); dp[0][0]=1; if(m==0) ans++; for(int i=1;i<=n;i++){ for(int j=0;j<maxn;j++){ if(dp[i-1][j]==0) continue; dp[i][j]+=dp[i-1][j]; int t=j^a[i-1]; dp[i][t]+=dp[i-1][j]; if(t>=m) ans+=dp[i-1][j]; } } printf("Case #%d: %lld ",kase,ans); } return 0; }