hdu 5119 Happy Matt Friends

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1<<20;
int dp[2][maxn];

/*
    n个数,价值为选择的数的^,输出大于等于m的方案数
    f[i][j] 前i个数,结果为j的方案数
    数最大是1e6,那么异或肯定小于2^20
    f[i][j]=f[i-1][j]+f[i-1][j^a[I]]
   复杂度O(n*maxn)大约是4e7,小数据可以改二进制枚举 */ int main(){ int x,t,n,m,cas=1; cin>>t; while(t--){ memset(dp,0,sizeof(dp)); dp[0][0]=1; cin>>n>>m; int p=1; for(int i=1;i<=n;i++){ cin>>x; for(int j=0;j<maxn;j++) dp[p][j]=dp[p^1][j]+dp[p^1][j^x]; p^=1; } ll res=0; for(int i=m;i<maxn;i++)res+=dp[n&1][i]; printf("Case #%d: %lld\n",cas++,res); } return 0; }

  

posted @ 2017-04-28 20:51  N维解析几何  阅读(128)  评论(0编辑  收藏  举报