51nod 1674 区间的价值 V2

    xiaoxiao2021-08-15  156

    #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

    最新回复(0)