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; }