Happy Matt Friends
Time Limit: 6000/6000 MS (Java/Others) Memory Limit: 510000/510000 K (Java/Others)Total Submission(s): 1642 Accepted Submission(s): 646
Each of Matt’s friends has a magic number. In the game, Matt selects some (could be zero) of his friends. If the xor (exclusive-or) sum of the selected friends’magic numbers is no less than M , Matt wins.
Matt wants to know the number of ways to win.
For each test case, the first line contains two integers N, M (1 ≤ N ≤ 40, 0 ≤ M ≤ 106).
In the second line, there are N integers ki (0 ≤ ki ≤ 106), indicating the i-th friend’s magic number.
題意:給出n個數要求任意數量的數的異或和大於m的方案數。
想法:類似於揹包問題。對於第i個數,可以選擇取或不取,取就是dp[i-1][j^a[i]],不取就是dp[i-1][j];所以狀態轉移方程是dp[i][j]=dp[i-1][j]+dp[i-1][j^a[i]];
代碼如下:
#include<cstdio>
#include<cstring>
int t,n,m,ch[44],dp[44][1<<20];
int main()
{
scanf("%d",&t);
int cas=1;
while(t--) {
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) {
scanf("%d",&ch[i]);
}
memset(dp,0,sizeof(dp));
dp[0][0]=1;
for(int i=1;i<=n;i++) {
for(int j=0;j<=(1<<20);j++) {
dp[i][j]=dp[i-1][j]+dp[i-1][j^ch[i]];
}
}
long long ans=0;
for(int i=m;i<(1<<20);i++) {
ans+=dp[n][i];
}
printf("Case #%d: %lld\n",cas++,ans);
}
return 0;
}