转载请注明出处: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; }