转载请注明出处:http://blog.csdn.net/vmurder/article/details/42612069
其实我就是觉得原创的访问量比未授权盗版多有点不爽233。。。
话说其实我并不知道它会不会变成土豪题。
应该会吧?先刷了吧。
题意:
给出一个数列,然后取一个两个子序列A、B,
使得A严格在B前面。
然后要求A的异或和(^)等于B的与和(&)。
题解:
动规。
注意判重。。没什么好注意的,不判重样例都过不去233。
啊。下午好颓废~~~不爽啊~~~这道题算是随便签个到吧?
代码:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 1050
#define MOD 1000000007
using namespace std;
int f[N][N],g[N][N],h[N][N],n;
int a[N];
int main()
{
// freopen("test.in","r",stdin);
int i,j,k,T;
for(scanf("%d",&T);T--;)
{
scanf("%d",&n);
f[0][0]=1;
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
for(j=0;j<1024;j++)f[i][j]=f[i-1][j],h[i][j]=0;
for(j=0;j<1024;j++)
{
f[i][j^a[i]]+=f[i-1][j],f[i][j^a[i]]%=MOD;
h[i][j^a[i]]+=f[i-1][j],h[i][j^a[i]]%=MOD;
}
}
memset(g[n+1],0,sizeof(g[n+1]));
g[n+1][1023]=1;
for(i=n;i;i--)
{
for(j=0;j<1024;j++)g[i][j]=g[i+1][j];
for(j=0;j<1024;j++)g[i][j&a[i]]+=g[i+1][j],g[i][j&a[i]]%=MOD;
}
for(i=1;i<=n;i++)f[i][0]--,g[i][1023]--;
long long ans=0;
for(i=1;i<n;i++)
for(j=0;j<1024;j++)ans+=(long long)h[i][j]*g[i+1][j],ans%=MOD;
printf("%lld\n",ans);
}
return 0;
}