标签:dp
Description
Input
Output
Sample Input
2 3 2 1 2 3 3 3 1 2 3
Sample Output
Case #1: 4 Case #2: 2
Hint
In the ?rst sample, Matt can win by selecting: friend with number 1 and friend with number 2. The xor sum is 3. friend with number 1 and friend with number 3. The xor sum is 2. friend with number 2. The xor sum is 2. friend with number 3. The xor sum is 3. Hence, the answer is 4.
分析:首先看题发现并没有什么明显的规律,然后考虑dp
dp[i][j]表示 前i个数里面异或值为j的方法数
找到递推关系即可;#include <iostream> #include <stdio.h> #include <string> #include <string.h> #include <algorithm> using namespace std; typedef long long ll; const int maxn=1e6+100; int n,m,test; int a[maxn]; ll dp[44][maxn]; ll solve() { memset(dp,0,sizeof(dp)); dp[1][0]=dp[1][a[1]]=1; for(int i=2;i<=n;i++) { for(int j=0;j<maxn;j++)dp[i][j]+=dp[i-1][j]; for(int j=0;j<maxn;j++)dp[i][a[i]^j]+=dp[i-1][j]; } ll ans=0; for(int i=m;i<maxn;i++) ans+=dp[n][i]; return ans; } int main() { int T,test=1; scanf("%d",&T); while( T-- ) { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%d",&a[i]); ll ans=solve(); printf("Case #%d: %lld\n",test++,ans); } return 0; }
标签:dp
原文地址:http://blog.csdn.net/liusuangeng/article/details/44302583