Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- #define gc c=getchar()
- #define r(x) read(x)
- #define ll long long
- template<typename T>
- inline void read(T&x){
- x=0;T k=1;char gc;
- while(!isdigit(c)){if(c=='-')k=-1;gc;}
- while(isdigit(c)){x=x*10+c-'0';gc;}x*=k;
- }
- const int p=1e9+7;
- const int N=1e4+7;
- inline void add(int &a,int b){
- if((a+=b)>=p)a-=p;
- }
- inline ll qpow(ll a,ll b){
- ll ans=1;
- while(b){
- if(b&1)(ans*=a)%=p;
- (a*=a)%=p;
- b>>=1;
- }
- return ans;
- }
- int a[N];
- int f[N][2][2];
- int main(){
- freopen("transparent.in","r",stdin);
- freopen("transparent.out","w",stdout);
- int n,sum=0,ans=0;r(n);
- for(int i=1;i<=n;++i)r(a[i]),sum^=a[i];
- for(int i=31;~i;--i){
- memset(f,0,sizeof(f));
- f[0][0][0]=1;
- for(int j=1;j<=n;++j){
- if(a[j]>>i&1){
- a[j]-=(1<<i);
- add(f[j][0][1],(ll)f[j-1][0][0]*(1<<i)%p);
- add(f[j][0][1],(ll)f[j-1][0][1]*(1<<i)%p);
- add(f[j][1][1],(ll)f[j-1][1][0]*(1<<i)%p);
- add(f[j][1][1],(ll)f[j-1][1][1]*(1<<i)%p);
- add(f[j][0][0],(ll)f[j-1][1][0]*(a[j]+1)%p);
- add(f[j][1][0],(ll)f[j-1][0][0]*(a[j]+1)%p);
- add(f[j][0][1],(ll)f[j-1][1][1]*(a[j]+1)%p);
- add(f[j][1][1],(ll)f[j-1][0][1]*(a[j]+1)%p);
- }
- else {
- add(f[j][0][0],(ll)f[j-1][0][0]*(a[j]+1)%p);
- add(f[j][1][0],(ll)f[j-1][1][0]*(a[j]+1)%p);
- add(f[j][0][1],(ll)f[j-1][0][1]*(a[j]+1)%p);
- add(f[j][1][1],(ll)f[j-1][1][1]*(a[j]+1)%p);
- }
- }
- add(ans,f[n][0][1]*qpow(1<<i,p-2)%p);
- if(sum>>i&1)break;
- }
- printf("%d\n",ans+(sum==0));
- return 0;
- }
- /*
- 6
- 1 2 4 8 16 64
- 5
- 7 11 12 3 5
- */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement