列表

详情


NC14414. 小AA的数列

描述

小AA找到了一个数列,她想要知道这个数列中所有长度为偶数的区间异或和之和 。
后来她发现这个问题太简单了,于是她加了一个限制,要求区间长度在[L,R]之间,
然后她就不会了。。。
请你告诉她问题的答案。

输入描述

第一行三个数 n, L, R(n<=105,1<=L<=R<=n)
第二行n个数表示这个数列。(ai<=109)

输出描述

输出一行表示答案,由于答案可能很大,请输出答案模109+7的值。

示例1

输入:

5 1 5
1 2 3 4 5

输出:

16

示例2

输入:

4 1 4
4 4 4 4

输出:

0

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

pypy3 解法, 执行用时: 536ms, 内存消耗: 35884K, 提交时间: 2021-06-08 02:29:24

from collections import Counter

MOD = int(1e9 + 7)
n, L, R = map(int, input().split())
a = list(map(int, input().split()))

def solve(t, m):
	if m <= 0: return 0
	res = 0
	for i in range(32):
		s = [0]
		for x in t: s.append((1 if (x & (1 << i)) != 0 else 0) ^ s[-1])
		c, d = Counter(), 0
		for j in range(m): c[s[j]] += 1
		for j in range(len(s)):
			if j + m < len(s): c[s[j + m]] += 1
			c[s[j]] -= 1
			d += c[s[j] ^ 1]
		res = (res + d * (1 << i)) % MOD
	return res

ans = 0
for k in range(2):
	t = [a[i] ^ a[i + 1] for i in range(k, n - 1, 2)]
	ans = (ans + solve(t, R // 2) - solve(t, (L + 1) // 2 - 1)) % MOD

print(ans)

C++11(clang++ 3.9) 解法, 执行用时: 104ms, 内存消耗: 1388K, 提交时间: 2020-05-27 12:50:56

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
ll cnt[2][2],a[1<<17];
int main()
{
    int n,l,r;
    cin>>n>>l>>r;
    for(int i=1;i<=n;i++) cin>>a[i],a[i]^=a[i-1];
    ll ans=0;
    for(int i=0;i<32;i++){
        memset(cnt,0,sizeof cnt);
        for(int j=l;j<=n;j++){
            cnt[(j-l)&1][(a[j-l]>>i)&1]++;
            if(j>r)cnt[(j-r-1)&1][(a[j-r-1]>>i)&1]--;
            ans=(ans+cnt[j&1][((a[j]>>i)&1)^1]*(1ll<<i)%mod)%mod;
        }
    }
    cout<<ans;
    return 0;
}

上一题