首页 > 其他分享 >「解题报告」HDU6358 Innocence

「解题报告」HDU6358 Innocence

时间:2023-06-16 16:45:14浏览次数:42  
标签:int lowbit sum ans HDU6358 解题 Innocence operatorname mathrm

其实挺简单的,但是考场上状态太差没推出来,暴力还挂了。麻了。

首先看题:发现,这不是我们异或 FWT 的题吗,下次出题记得标明出处

容易发现,我们实际上要求的就是集合幂级数 \([x^k](x^l + x^{l + 1} + \cdots + x^{r - 1} + x^r)^n\)。考虑直接手动模拟 FWT。

设 \(F(l, r) = FWT(x^l + x^{l + 1} + \cdots + x^{r - 1} + x^r)\),那么由于 FWT 是线性运算,我们直接前缀和差分就可以求出 \(F(l, r)\) 即可。我们设 \(G(r) = \sum_{i=0}^{r-1} x^i\),那么 \(F(l, r) = G(r + 1) - G(l)\)。那么我们要解决两个问题:

  1. \(G(r)\) 怎么计算;
  2. \(IFWT(F(l, r)^n)\) 怎么计算。

首先考虑第一个问题:直接写出 FWT 的式子:\(b_i = \sum (-1)^{p(i \operatorname{\&} j)} a_j\)。那么 \(G(r)\) 就是:

\[G(r)_ i = \sum_{j=0}^{r-1} (-1)^{p(i \operatorname{\&} j)} \]

考虑将 \(r\) 按照二进制位拆开,这样原来的区间可以拆成若干个形如 \(\left[\left(\left\lfloor\dfrac{r}{2^i}\right\rfloor - 1\right) 2^i, \left\lfloor\dfrac{r}{2^i}\right\rfloor 2^i - 1\right]\) 的区间,对每一个区间进行考虑。

首先考虑 \(G(2^m)\),容易发现这时候相当于任意选定一个集合,\(i\) 和这个集合的交的奇偶性之和,写成式子就是:

\[G(2^m)_ i = 2^{m - p(i \operatorname{\&} (2^m - 1))} \sum_{j=0}^{p(i \operatorname{\&} (2^m - 1))} \binom{p(i \operatorname{\&} (2^m - 1))}{i} (-1)^i = 2^{m - p(i \operatorname{\&} (2^m - 1))} [p(i \operatorname{\&} (2^m - 1)) = 0] = 2^m [i \operatorname{\&} (2^m - 1) = 0] \]

即,当且仅当 \(i\) 为 \(2^m\) 的倍数时有值,值为 \(2^m\)。

那么考虑拆分成的区间,考虑从 \(G(2^i)\) 递推过来。发现,对于每一个 \(G(2^i)_ j\),实际上只需要再乘上一个 \((-1)^{p(\left\lfloor\frac{j \operatorname{\&} r}{2^i}\right\rfloor)}\) 即可。而由于 \(j\) 仅在 \(2^i | j\) 的地方有值,那么 \((-1)^{p(\left\lfloor\frac{j \operatorname{\&} r}{2^i}\right\rfloor)} = (-1)^{p(j \operatorname{\&} r) + \lfloor\frac{j}{2^i}\rfloor \operatorname{\&} 1}\),我们可以把 \((-1)^{p(j \operatorname{\&} r)}\) 提出来,那么剩下的部分其实就是交替 \(\pm 2^i\)。

那么我们就知道了,\(G(r)\) 就是若干个形如 \(\{2^i, 0, \cdots, 0, -2^i, 0, \cdots, 0, \cdots\}\) 的序列加起来。简单画一下,发现我们只关心 \(2^i\) 的 \(\mathrm{lowbit}\),\(r\) 在这一位以下的所有位都会造成贡献。而我们又能想到,除了最高位以外,其它的每一位 \(\lfloor\frac{j}{2^i}\rfloor\) 一定都是偶数,即一定都是正,而最高位一定是负数。所以我们可以得出,\(G(r)_ i\) 实际上等于 \(r \operatorname{\&} (\mathrm{lowbit}(i) - 1)\) 除去最高位的所有位减掉最高位,再乘上 \((-1)^{p(i \operatorname{\&} r)}\)。即:

\[G(r)_ i = (-1)^{p(r \operatorname{\&} i)} ((r \operatorname{\&} (\mathrm{lowbit}(i) - 1)) - (r \operatorname{\&} \mathrm{lowbit}(i))) \]

需要注意 \(G(r)_0 = r\),因为 \(\mathrm{lowbit}(0)\) 没有定义。

现在考虑第二个问题:如何计算 \(IFWT(F(l, r))\)?

同样直接手拆式子,可以得到:

\[\begin{aligned} IFWT(F(l, r)^n)_k &= \frac{1}{2^m} \sum_i (-1)^{p(i \operatorname{\&} k)} a_i\\ &= \frac{1}{2^m} \left((r - l)^n + \sum_{i \ge 1} (-1)^{p(i \operatorname{\&} k)} \left( (-1)^{p(r \operatorname{\&} i)} f(r, \mathrm{lowbit}(i)) - (-1)^{p(l \operatorname{\&} i)} f(l, \mathrm{lowbit}(i))\right)^n\right)\\ &= \frac{1}{2^m} \left((r - l)^n + \sum_{i \ge 1} (-1)^{p(i \operatorname{\&} k)} \sum_{j=0}^{n} \binom{n}{j} (-1)^{(n - j) p(r \operatorname{\&} i) + jp(l \operatorname{\&} i)} (-1)^k f(r,\mathrm{lowbit}(i))^{n - j} f(l,\mathrm{lowbit}(i))^j\right)\\ &= \frac{1}{2^m} \left((r - l)^n + \sum_{i \ge 1} (-1)^{p(i \operatorname{\&} k) + n p(i \operatorname{\&} r)} \sum_{j=0}^{n} \binom{n}{j} (-1)^{j p((l \oplus r) \operatorname{\&} i)} (-1)^k f(r,\mathrm{lowbit}(i))^{n - j} f(l,\mathrm{lowbit}(i))^j\right)\\ \end{aligned} \]

首先前面一部分如果 \(n\) 为奇数就直接给 \(k\) 异或上一个 \(r\),那么现在就只管后面一部分了。后面一部分比较恶心的就是那个 \((-1)^{j p((l \oplus r) \operatorname{\&} i)}\),考虑直接枚举 \(j\) 的奇偶性,那么那一部分就也可以提取出来了。发现后面的式子与 \(\mathrm{lowbit}(i)\) 有关,那么我们直接枚举这个 \(\mathrm{lowbit(i)}\),那么这部分相当于一个常量了。后面的东西是一个形如 \(\sum \binom{n}{i} a^i b^{n - i} [i \text{ is even/odd}]\),这个东西可以通过给 \(b\) 加上一个 \(-1\),由 \(\frac{(a+b)^n \pm (a-b)^n}{2}\) 实现只保留奇数 / 偶数位置的值,然后后面那个东西就也可以 \(O(\log n)\) 求出来了。

然后考虑前面的东西,实际要求一个形如 \(\sum_{\mathrm{lowbit}(i) = 2^j} (-1)^{p(i \operatorname{\&} k)}\) 的东西。首先 \(\mathrm{lowbit}(i) = 2^j\) 的限制可以直接通过两边都除以 \(2^j\) 去掉,那么剩下的就是 \(2^{m - j - 1}(-1)^{\lfloor\frac{k}{2^{j}}\rfloor \operatorname{\&} 1}[\lfloor\frac{k}{2^{j+1}}\rfloor = 0]\)。推导略掉了,容易推出来。

那么把式子揉揉即可。不是很难写。总复杂度 \(O(Tq\log^2n)\)。

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 305, P = 1000000007;
int T;
int n, l, r, q;
int qpow(int a, int b) {
    a = (a % P + P) % P;
    int ans = 1;
    while (b) {
        if (b & 1) ans = 1ll * ans * a % P;
        a = 1ll * a * a % P;
        b >>= 1;
    }
    return ans;
}
const int INV2 = (P + 1) / 2;
int main() {
    freopen("jerry.in", "r", stdin);
    freopen("jerry.out", "w", stdout);
    scanf("%d", &T);
    while (T--) {
        scanf("%d%d%d%d", &n, &l, &r, &q);
        r++;
        int m = 30;
        while (q--) {
            int k; scanf("%d", &k);
            if (n & 1) k ^= r;
            int ans = qpow(r - l, n);
            for (int i = 0; i < m; i++) {
                int p = (l & ((1 << i) - 1)) - (l & (1 << i)), q = (r & ((1 << i) - 1)) - (r & (1 << i));
                int x = qpow((p + q) % P, n), y = qpow((q - p + P) % P, n);
                int even = 1ll * (x + y) * INV2 % P, odd = 1ll * (y - x + P) * INV2 % P;
                if (!(k >> (i + 1))) {
                    ans = (ans + 1ll * even * (1 << m - 1 - i) % P * ((k >> i & 1) ? P - 1ll : 1ll)) % P;
                }
                if (!((k ^ l ^ r) >> (i + 1))) {
                    ans = (ans + 1ll * odd * (1 << m - 1 - i) % P * (((k ^ l ^ r) >> i & 1) ? P - 1ll : 1ll)) % P;
                }
            }
            ans = 1ll * ans * qpow((1 << m), P - 2) % P;
            printf("%d\n", ans);
        }
    }
    return 0;
}

标签:int,lowbit,sum,ans,HDU6358,解题,Innocence,operatorname,mathrm
From: https://www.cnblogs.com/apjifengc/p/17485774.html

相关文章

  • 「解题报告」CF1738H Palindrome Addicts
    神秘回文串题。首先容易发现要求的是区间本质不同回文串个数,所以直接上论文做法即可。容易想到增量构建回文自动机,假如现在建出了\([1,r]\)的PAM,考虑有多少回文串出现在了\([l,r]\)内。考虑记录每个回文串的最后一次出现位置\(last_p\),那么这个串的左端点就是\(last_p......
  • [网络安全] DVWA之 Open HTTP Redirect 攻击姿势及解题详析合集
    Lowlevel主页面如下:点击Quote1,发现url传递参数源代码审计源码如下:<?phpif(array_key_exists("redirect",$_GET)&&$_GET['redirect']!=""){header("location:".$_GET['redirect']);exit;}http......
  • 「解题报告」CF1815E Bosco and Particle
    好像不难。但是没想到。首先这玩意看起来就得拆开,要不然完全做不了。假如我们只考虑某一个点\(i\),考虑\(i-1\toi,i\toi+1\)这两条边的经过次数,不难发现其它的点是不会影响这两条边的。那么我们可以直接依据题意模拟,只考虑这一个点的周期是多长,然后所有的周期\(\mat......
  • [ABC303G] Bags Game 解题分析
    1题目大意1.1题目翻译有两个人轮流取物品。总共有\(n\)个物品,第\(i\)个物品的价值为\(w_i\)。他们按照下面的其中一种方式取物品:取出这一排物品最前面的或者最后面的。这一步没有代价。设还剩下\(m\)个物品,那么重复取出\(\min(B,m)\)个物品,每次取出最前面的......
  • 「解题报告」CF1662J Training Camp
    模拟赛题,数据水被dfs草过去了。我们可以把每个点分成两个点\(a_{i,j},b_{i,j}\),设这一行中选取的数为\(v\),那么对于一行内\(\gev\)的点选\(a\),大于\(v\)的点选\(b\),那么题目的限制相当于每个点只能够选一个颜色。看起来就像网络流,考虑怎么转化到图上去。我们发现......
  • 「解题报告」CF1290F Making Shapes
    最近好像一直懒得写题解,但是感觉还是写一写比较好。首先若干个向量组成一个凸包有经典做法,就是把向量按照极角排序,然后按照极角顺序依次拼接,得到的就是一个凸包,且方案唯一(由于本题限制不存在共线的两个向量)。那么我们实际上只需要知道每个向量最终用了多少就可以了。设第\(i\)......
  • 蓝桥杯十一届JavaA组-C++解题
    随便乱写,目前正确性未知C.本质上升序列#include<bits/stdc++.h>usingnamespacestd;boolaccess[4][4];intdfs(intidx,intx,inty){ if(x<0||y<0||x>=4||y>=4) return0; if(access[y][x]) return0; if(idx>=15) return1; intcount=0; access......
  • 「解题报告」CF768G The Winds of Winter
    真的不难,为啥是3300*。还是模拟赛T3,很气啊,为什么不先看这个题。首先贪心很容易发现一定是将当前子树大小最大的那棵树的某个子树移动到最小的那个树内。那么我们记移动的这个子树的大小为\(x\),所有树中最小的树大小为\(a\),最大的为\(c\),次大的为\(b\),那么我们就是在最小化......
  • 「解题报告」CF936D World of Tank
    lxl。模拟赛T1。3000*。不过好像确实不是很难,考场上做出来的。首先这玩意看起来就很DP了。格子很多,但是离散化一下之后就很少了,可以直接跑DP。那么我们考虑如何DP这个过程。首先很容易发现一点,就是我们攻击到的格子一定会经过。否则显然攻击这个格子是没有意义的。那么我......
  • 「解题报告」CF1329E Dreamoon Loves AA
    好题。首先可以把题意转化一下,我们先把每相邻两个A的距离写成一个数组,然后对这个数组进行考虑。那么我们每改一个数,实际上就是将这个数组中的一个数分成两个数,我们要求的就是把这个数组分成\(K=k+m+1\)个数,最小化极差。首先不难得出一点,就是每个数最后肯定是被均分成......