Advertisement
yicongli

T151T3

Mar 14th, 2019
132
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.51 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define gc c=getchar()
  6. #define r(x) read(x)
  7. #define ll long long
  8.  
  9. template<typename T>
  10. inline void read(T&x){
  11.     x=0;T k=1;char gc;
  12.     while(!isdigit(c)){if(c=='-')k=-1;gc;}
  13.     while(isdigit(c)){x=x*10+c-'0';gc;}x*=k;
  14. }
  15.  
  16. const int p=1e9+7;
  17. const int N=1e4+7;
  18.  
  19. inline void add(int &a,int b){
  20.     if((a+=b)>=p)a-=p;
  21. }
  22.  
  23. inline ll qpow(ll a,ll b){
  24.     ll ans=1;
  25.     while(b){
  26.         if(b&1)(ans*=a)%=p;
  27.         (a*=a)%=p;
  28.         b>>=1;
  29.     }
  30.     return ans;
  31. }
  32.  
  33. int a[N];
  34. int f[N][2][2];
  35.  
  36. int main(){
  37.     freopen("transparent.in","r",stdin);
  38.     freopen("transparent.out","w",stdout);
  39.     int n,sum=0,ans=0;r(n);
  40.     for(int i=1;i<=n;++i)r(a[i]),sum^=a[i];
  41.     for(int i=31;~i;--i){
  42.         memset(f,0,sizeof(f));
  43.         f[0][0][0]=1;
  44.         for(int j=1;j<=n;++j){
  45.             if(a[j]>>i&1){
  46.                 a[j]-=(1<<i);
  47.                
  48.                 add(f[j][0][1],(ll)f[j-1][0][0]*(1<<i)%p);
  49.                 add(f[j][0][1],(ll)f[j-1][0][1]*(1<<i)%p);
  50.                 add(f[j][1][1],(ll)f[j-1][1][0]*(1<<i)%p);
  51.                 add(f[j][1][1],(ll)f[j-1][1][1]*(1<<i)%p);
  52.                
  53.                 add(f[j][0][0],(ll)f[j-1][1][0]*(a[j]+1)%p);
  54.                 add(f[j][1][0],(ll)f[j-1][0][0]*(a[j]+1)%p);
  55.                 add(f[j][0][1],(ll)f[j-1][1][1]*(a[j]+1)%p);
  56.                 add(f[j][1][1],(ll)f[j-1][0][1]*(a[j]+1)%p);
  57.             }
  58.             else {
  59.                 add(f[j][0][0],(ll)f[j-1][0][0]*(a[j]+1)%p);
  60.                 add(f[j][1][0],(ll)f[j-1][1][0]*(a[j]+1)%p);
  61.                 add(f[j][0][1],(ll)f[j-1][0][1]*(a[j]+1)%p);
  62.                 add(f[j][1][1],(ll)f[j-1][1][1]*(a[j]+1)%p);
  63.             }
  64.         }
  65.         add(ans,f[n][0][1]*qpow(1<<i,p-2)%p);
  66.         if(sum>>i&1)break;
  67.     }
  68.     printf("%d\n",ans+(sum==0));   
  69.     return 0;
  70. }
  71. /*
  72. 6
  73. 1 2 4 8 16 64
  74. 5
  75. 7 11 12 3 5
  76. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement