2026天梯赛选拔赛-L3-1-辉夜的幻想世界 · znzryb
## 题目大意
**题目总结:**
给定一个长度为 `n` 的数组 `a`。
对任意区间 `[l, r]`,定义其权值为:
$$
w=\sum_{i=l}^{r}\sum_{j=l}^{r}(a_i \oplus a_j)
$$
其中 `⊕` 表示按位异或。
要求你计算数组中**所有非空子区间**的权值之和,并对 `10^9+7` 取模后输出。
输入范围为:
- `1 ≤ n ≤ 2×10^5`
- `0 ≤ a_i ≤ 10^6`
输出一个整数,表示最终答案。
**样例:**
```
输入:
6
1 1 4 5 1 4
输出:
422
```
样例含义:对数组 `[1,1,4,5,1,4]` 的所有非空子区间分别计算上述双重异或和权值,再把这些权值全部累加,最终结果为 `422`。
## 思路讲解
注意,题目中的是非有序对双重求和,所以结果不要忘记乘以一个 2。
```cpp
vector<vector<ll>> suf_bits(N+2,vector<ll>(26));
vector<vector<ll>> suf_nobits(N+2,vector<ll>(26));
for (ll i=N;i>=1;--i) {
for (int j=0;j<25;++j) {
// 注意,我们这里写的是(N-i+1),是指的包含 i 的可以选择的右端点数量
suf_bits[i][j]=suf_bits[i+1][j]+(A[i]>>j&1)*(N-i+1);
// (A[i]>>j&1)^1,不要偷懒,不加这个 &1,一定要有 &1 才对
suf_nobits[i][j]=suf_nobits[i+1][j]+((A[i]>>j&1)^1)*(N-i+1);
}
}
ll ans=0;
for (int i=1;i<=N;++i) {
for (int j=0;j<25;++j) {
if (A[i]>>j&1) {
ll suf=suf_nobits[i+1][j];
ll lans=suf%mod*i%mod;
lans*=(1ll<<j);
lans%=mod;
ans+=lans*2;
ans%=mod;
}else {
ll suf=suf_bits[i+1][j];
ll lans=suf%mod*i%mod;
lans*=(1ll<<j);
lans%=mod;
ans+=lans*2;
ans%=mod;
}
}
}
```
## AC代码
AC
[http://10.199.227.101/contest/1005/problem/L3-1/submission-detail/2157](http://10.199.227.101/contest/1005/problem/L3-1/submission-detail/2157)
::: 源代码
```cpp
/**
* Problem: ${PROBLEM_NAME}
* Contest: ${PROBLEM_GROUP_NAME}
* Judge: ${ONLINE_JUDGE_NAME}
* URL: ${PROBLEM_URL}
* Created: 2026-03-16 11:05:01
* Author: Gospel_rock
* My blog: https://znzryb.com/
*
* Powered by AutoCp https://github.com/Pushpavel/AutoCp
*/
#include <bits/stdc++.h>
#define all(vec) vec.begin(),vec.end()
#define lson(o) (o<<1)
#define rson(o) (o<<1|1)
#define SZ(a) ((long long) a.size())
#define debug(var) cerr << #var <<" = ["<<var<<"]"<<"\n";
#define debug1d(a) \
cerr << #a << " = ["; \
for (int i = 0; i < (int)(a).size(); i++) \
cerr << (i ? ", " : "") << a[i]; \
cerr << "]\n";
#define debug2d(a) \
cerr << #a << " = [\n"; \
for (int i = 0; i < (int)(a).size(); i++) \
{ \
cerr << " ["; \
for (int j = 0; j < (int)(a[i]).size(); j++) \
cerr << (j ? ", " : "") << a[i][j]; \
cerr << "]\n"; \
} \
cerr << "]\n";
#define debug3d(a) \
cerr << #a << " = [\n"; \
for (int i = 0; i < (int)(a).size(); i++) \
{ \
cerr << " [\n"; \
for (int j = 0; j < (int)(a[i]).size(); j++) \
{ \
cerr << " ["; \
for (int k = 0; k < (int)(a[i][j]).size(); k++) \
cerr << (k ? ", " : "") << a[i][j][k]; \
cerr << "]\n"; \
} \
cerr << " ]\n"; \
} \
cerr << "]\n";
#define cend cerr<<"\n-----------\n"
#define fsp(x) fixed<<setprecision(x)
using namespace std;
using ll = long long;
using ull = unsigned long long;
using DB = double;
// using i128 = __int128;
using CD = complex<double>;
static constexpr ll MAXN = (ll) 1e6 + 10, INF = (1ll << 61) - 1;
static constexpr ll mod = (ll)1e9+7;
static constexpr double eps = 1e-8;
const double pi = acos(-1.0);
ll lT, testcase;
/*
*
*/
void Solve() {
ll N;
cin >> N;
vector<ll> A(N+2);
for (int i=1;i<=N;++i) {
cin>>A[i];
}
vector<vector<ll>> suf_bits(N+2,vector<ll>(26));
vector<vector<ll>> suf_nobits(N+2,vector<ll>(26));
for (ll i=N;i>=1;--i) {
for (int j=0;j<25;++j) {
suf_bits[i][j]=suf_bits[i+1][j]+(A[i]>>j&1)*(N-i+1);
suf_nobits[i][j]=suf_nobits[i+1][j]+((A[i]>>j&1)^1)*(N-i+1);
}
}
ll ans=0;
for (int i=1;i<=N;++i) {
for (int j=0;j<25;++j) {
if (A[i]>>j&1) {
ll suf=suf_nobits[i+1][j];
ll lans=suf%mod*i%mod;
lans*=(1ll<<j);
lans%=mod;
ans+=lans*2;
ans%=mod;
}else {
ll suf=suf_bits[i+1][j];
ll lans=suf%mod*i%mod;
lans*=(1ll<<j);
lans%=mod;
ans+=lans*2;
ans%=mod;
}
}
}
ans%=mod;
cout<<ans<<"\n";
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
#ifdef LOCAL
cout.setf(ios::unitbuf); // 无缓冲流,方便我们调试
#endif
// cin >> lT;
// for (testcase = 1; testcase <= lT; ++testcase)
Solve();
return 0;
}
/*
AC
http://10.199.227.101/contest/1005/problem/L3-1/submission-detail/2157
*/
```
:::
## 心路历程(WA,TLE,MLE……)