NC14414. 小AA的数列
描述
输入描述
第一行三个数 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; }