http://acm.hdu.edu.cn/showproblem.php?pid=4901
dp1[i][j]是i参与,异或值为j的个数,x1[i][j]是以i位置向前到1的位置的异或值为j的个数,dp2[i][j]是i参与,&值为j的个数,x2[i][j]是以i位置向前到n的位置的&值为j的个数。
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #define ll __int64 5 using namespace std; 6 const int mod=1000000007; 7 8 ll dp1[1100][1100]; 9 ll dp2[1100][1100]; 10 ll x1[1100][1100]; 11 ll x2[1100][1100]; 12 int t,n; 13 int c[1100]; 14 15 int main() 16 { 17 scanf("%d",&t); 18 while(t--) 19 { 20 scanf("%d",&n); 21 for(int i=1; i<=n; i++) 22 { 23 scanf("%d",&c[i]); 24 } 25 memset(dp1,0,sizeof(dp1)); 26 memset(dp2,0,sizeof(dp2)); 27 memset(x1,0,sizeof(x1)); 28 memset(x2,0,sizeof(x2)); 29 for(int i=1; i<=n; i++) 30 { 31 for(int j=0; j<=1024; j++) 32 { 33 int m=j^c[i]; 34 dp1[i][m]=(dp1[i][m]+x1[i-1][j])%mod; 35 } 36 dp1[i][c[i]]=(dp1[i][c[i]]+1)%mod; 37 for(int j=0; j<=1024; j++) 38 { 39 x1[i][j]=(x1[i-1][j]+dp1[i][j])%mod; 40 } 41 } 42 for(int i=n; i>=1; i--) 43 { 44 for(int j=0; j<=1024; j++) 45 { 46 int m=j&c[i]; 47 dp2[i][m]=(dp2[i][m]+x2[i+1][j])%mod; 48 } 49 dp2[i][c[i]]=(dp2[i][c[i]]+1)%mod; 50 for(int j=0; j<=1024; j++) 51 { 52 x2[i][j]=(x2[i+1][j]+dp2[i][j])%mod; 53 } 54 } 55 ll ans=0,sum; 56 for(int i=1; i<=n-1; i++) 57 { 58 for(int j=0; j<=1024; j++) 59 { 60 sum=(dp1[i][j]*x2[i+1][j])%mod; 61 ans=(ans+sum)%mod; 62 } 63 } 64 printf("%I64d ",ans); 65 } 66 return 0; 67 }