wannafly4 挑战杯 B.小AA的数列(区间异或和)

来源:互联网 发布:软件设计师证书有效期 编辑:程序博客网 时间:2024/04/28 06:57
#include<bits/stdc++.h>using namespace std;typedef long long LL;const LL mod=1e9+7;int a[100005];int xorsum[100005];int dp[2][2];//i为下标奇偶,j为在此位前缀和有多少个奇数1int odd[100005];int n,L,R;LL getans(int x){    LL ans=0;    for(int i=0;i<31;i++)    {        LL temp=0;        dp[1][0]=dp[1][1]=dp[0][1]=0;        dp[0][0]=1;        odd[0]=0;        for(int j=1;j<=n;j++)            if(xorsum[j]&(1ll<<i))                odd[j]=1;            else                odd[j]=0;        for(int j=1;j<=n;j++)        {            if(j>x)                dp[(j-x-1)&1][odd[j-x-1]]--;            temp+=dp[j&1][!odd[j]];            dp[j&1][odd[j]]++;        }        cout<<temp<<endl;        ans=(ans+temp*(1ll<<i)%mod)%mod;    }    return ans;}int main(){    scanf("%d%d%d",&n,&L,&R);    for(int i=1;i<=n;i++)        scanf("%d",&a[i]);    for(int i=1;i<=n;i++)        xorsum[i]=a[i]^xorsum[i-1];    printf("%lld\n",(getans(R)-getans(L-1)+mod)%mod);    return 0;}

原创粉丝点击