#include <bits/stdc++.h>
using namespace std;
const long long mod=1000000007;
long long a[100100],dif[100100][35],bef[2][35],diforder[35];
int main()
{
long long n,i,j,ans,andsum,orsum;
while(cin>>n)
{
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
for(i=0;i<=30;i++)
{
bef[0][i]=bef[1][i]=0;
}
for(i=1;i<=n;i++)
{
for(j=0;j<=30;j++)
{
if(a[i]&(1<<j))
{
dif[i][j]=bef[0][j];
bef[1][j]=i;
}
else
{
dif[i][j]=bef[1][j];
bef[0][j]=i;
}
}
}
ans=0;
for(i=1;i<=n;i++)
{
andsum=a[i];
orsum=a[i];
for(j=0;j<=30;j++)
{
diforder[j]=dif[i][j];
}
diforder[31]=i;
sort(diforder,diforder+32);
for(j=30;j>=0;j--)
{
ans+=(diforder[j+1]-diforder[j])*(andsum*orsum%mod)%mod;
ans%=mod;
andsum&=a[diforder[j]];
orsum|=a[diforder[j]];
}
}
printf("%lld\n",ans);
}
}
转载请注明原文地址: https://ju.6miu.com/read-676351.html