分别从1-->n开始计算 包含该数所形成的数的数目以及跟前面形成的总数目 异或的方案数
dp1[i][j][1] = (dp1[i][j][1] + dp1[i-1][j^num[i]][0]) % MOD;
dp1[i][j][0] = (dp1[i-1][j][0] + dp1[i][j][1]) % MOD;
后从 n->1开始 包含该数所形成的数的数目,以及总数目。 不过可以和起来写。。 AND 的方案数
dp2[i][j] = (dp2[i][j] + dp2[i+1][j]) % MOD;
dp2[i][j&num[i]] = (dp2[i][j&num[i]] + dp2[i+1][j]) % MOD;
代码..
//tpl
//ipqhjjybj_tpl.h
//header.h
#include <cstdio>
#include <cstdlib>
#include <map>
#include <set>
#include <algorithm>
#include <cstring>
#include <iostream>
#include <vector>
#include <string>
#include <queue>
#define mp(x,y) make_pair(x,y)
#define pii pair<int,int>
#define pLL pair<long long ,long long>
#define repn(i,j,k) for(int i = j; i <= k;i++)
#define MAX(x,a) x=((x)<(a))?(a):(x);
#define MIN(x,a) x=((x)>(a))?(a):(x);
using namespace std;
const int N = 1028;
const int MOD = 1e9+7;
int n;
long long dp1[N][N][2],dp2[N][N];
int num[N];
int main(){
int t;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
memset(dp1,0,sizeof(dp1));
memset(dp2,0,sizeof(dp2));
repn(i,1,n) scanf("%d",num+i);
if(n<=1){
printf("0\n");
continue;
}
repn(i,1,n){
dp1[i][num[i]][1]++;
repn(j,0,1024){
dp1[i][j][1] = (dp1[i][j][1] + dp1[i-1][j^num[i]][0]) % MOD;
dp1[i][j][0] = (dp1[i-1][j][0] + dp1[i][j][1]) % MOD;
}
}
for(int i=n;i>=1;i--){
dp2[i][num[i]]++;
repn(j,0,1024){
dp2[i][j] = (dp2[i][j] + dp2[i+1][j]) % MOD;
dp2[i][j&num[i]] = (dp2[i][j&num[i]] + dp2[i+1][j]) % MOD;
}
}
long long ans = 0;
for(int i = 1; i < n;i++){
repn(j,0,1024)
ans = (ans + dp1[i][j][1] * dp2[i+1][j]) % MOD;
}
ans = (ans % MOD + MOD) % MOD;
cout << ans << endl;
}
return 0;
}