P6599 「EZEC-2」构造

题意

传送门 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=1lj=1i1aiaj=1j<ilaiaj+1i<jlajai+1i=jlaiaj=1i,jlaiaj 依次考虑每一位。设第 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 1000,即 2 l i m 2^{lim} 2lim;以及 y y y 011 ⋯ 1 011\cdots1 0111,即 2 l i m − 1 2^{lim}-1 2lim1

则答案为 ∑ k = 0 l i m 2 k × x y \sum\limits_{k=0}^{lim}2^k\times xy k=0lim2k×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;
}

猜你喜欢

转载自blog.csdn.net/neweryyy/article/details/119684720
P2P