题意
传送门 P6599 「EZEC-2」异或
题解
为了方便分析,将和式乘二后变形为索引域对称的形式
2 ∑ i = 1 l ∑ j = 1 i − 1 a i ⊕ a j = ∑ 1 ≤ j < i ≤ l a i ⊕ a j + ∑ 1 ≤ i < j ≤ l a j ⊕ a i + ∑ 1 ≤ i = j ≤ l a i ⊕ a j = ∑ 1 ≤ i , j ≤ l a i ⊕ a j 2\sum\limits_{i=1}^{l}\sum\limits_{j=1}^{i-1}a_i\oplus a_j=\sum\limits_{1\leq j<i\leq l}a_i\oplus a_j+\sum\limits_{1\leq i<j\leq l}a_j\oplus a_i+\sum\limits_{1\leq i=j\leq l}a_i\oplus a_j=\sum\limits_{1\leq i,j\leq l}a_i\oplus a_j 2i=1∑lj=1∑i−1ai⊕aj=1≤j<i≤l∑ai⊕aj+1≤i<j≤l∑aj⊕ai+1≤i=j≤l∑ai⊕aj=1≤i,j≤l∑ai⊕aj 依次考虑每一位。设第 k k k 位中 0 , 1 0,1 0,1 数量分别为 x , y x,y x,y,在矩形索引域中, a i a_i ai 值为 0 0 0 的行 i i i 求和为 y y y,共 x x x 行;值为 1 1 1 的行同理。那么这一位的贡献为 2 k × 2 × x y 2^k\times 2\times xy 2k×2×xy,对应到原和式要除以二。 x y xy xy 取最大值时,有 x = ⌊ L / 2 ⌋ , y = ⌈ L / 2 ⌉ x=\lfloor L/2\rfloor,y=\lceil L/2\rceil x=⌊L/2⌋,y=⌈L/2⌉(可交换)。
考虑到序列元素有上界限制,最高位为 1 1 1 的元素应该尽可能小。设 N N N 二进制表示的最高位为 l i m lim lim。于是得到一组构造: x x x 个 100 ⋯ 0 100\cdots0 100⋯0,即 2 l i m 2^{lim} 2lim;以及 y y y 个 011 ⋯ 1 011\cdots1 011⋯1,即 2 l i m − 1 2^{lim}-1 2lim−1。
则答案为 ∑ k = 0 l i m 2 k × x y \sum\limits_{k=0}^{lim}2^k\times xy k=0∑lim2k×xy
需要注意的是,序列元素存在下界 1 1 1。则当 l i m = 0 lim=0 lim=0 时无法构造上述序列,需要特判。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod = 1000000007, maxlg = 45;
int T, L;
ll N, B[maxlg];
int main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
B[0] = 1;
for (int i = 0; i + 1 < maxlg; ++i)
B[i + 1] = (B[i] << 1) % mod;
cin >> T;
while (T--)
{
cin >> N >> L;
if (N == 1)
{
cout << 0 << '\n';
continue;
}
int lim = maxlg;
while ((1LL << lim) > N)
--lim;
ll x = L >> 1, y = L - x, s = x * y % mod;
ll res = 0;
for (int k = 0; k <= lim; ++k)
res = (res + s * B[k] % mod) % mod;
cout << res << '\n';
}
return 0;
}