AtCoder 杂题选座
AtCoder 杂题选做
整理一下,分类不严谨。
DP & 组合数学
ARC217C Greedy Customers 2
好久没自己想出来一道题了。
# define 钦定 按住
给定 \(N\) 个商品及其价格 \(A_i\),现在有 \(N\) 个人依次来商店购物,每个人手里有 \(C\) 日元,购买方式如下:
- 随机均匀在 \([1,C]\) 中抽取一个整数 \(x\) 作为预算,并购买剩余商品价格 \(\le x\) 的中的最贵的一个,若没有,则直接离开。
对于每个 \(k=0,1,\cdots,N\),求恰好卖出 \(k\) 件商品的概率,对 \(998244353\) 取模。
\(1\le N\le 100\)
考虑一个十分 naive 的状压 dp,即我加一个二进制状态,来记录剩下的商品集合,直接转移即可。时间复杂度 \(O(n2^n)\)。
考虑能否减少记录无用状态,或者合并状态。你会发现从这个方向看并不好下手,因为这种 dp 与时间有关,怎么搞都有后效性。
观察,你会发现如果每个人确定了它们抽的数,由于他们都是按贪心的策略,那么无论他们按什么顺序买,最后剩下的商品集合一定都是一样的,即结果和时间压根没关系。这是一步关键观察,即我们可以按其它顺序 dp。
因此我们钦定他们按预算从小到大来买,考虑预算在区间 \([A_i,A_{i+1})\) 的所有人,那么如果前面有剩下的商品,我们一定就会尽可能多的给这些人分配了。
因此容易定义 dp 状态,设现在枚举到第 \(i\) 个区间,前面所有区间(包括当前区间)有 \(j\) 个人,且前面所有区间(包括当前区间)还剩 \(k\) 个商品没买的方案数为 \(dp_{i,j,k}\)。
先提前算好所有区间的长度 \(len_i\),以及包含了几个商品 \(tmp_i\)。多枚举一层 \(p\),表示当前区间有多少个人。那么假如说我当前区间的商品就足以供给这几个人了,我不仅可以不用以前的商品,还可以多存点给后面用,即 \(dp_{i-1,j-p,k}\) 转移到 \(dp_{i,j,k+tmp_i-p}\)。
假如说不够的话,我就得动用以前的了,如果以前的商品够,那我还是从 \(dp_{i-1,j-p,k}\) 转移到 \(dp_{i,j,k+tmp_i-p}\);如果不够,那就没办法了,从 \(dp_{i-1,j-p,k}\) 转移到 \(dp_{i,j,0}\)。最后 \(dp_{cnt,n,n-k}\) 就是对应 \(k\) 的答案,其中 \(cnt\) 是区间个数。
然后再考虑转移系数要乘多少。首先总得确定,当前区间是哪几个人,方案数是 \(\binom{n-j+p}{p}\),然后要给他们每个人分配一个位置,因此转移系数为 \(\binom{n-j+p}{p}\cdot len_i^p\)。
ARC074E RGB Sequence
有一个长 \(N\) 的序列 \(A\),要给序列中的每个元素一种颜色 \(\{1,2,3 \}\)。
有 \(M\) 条限制 \((l,r,x)\),表示 \(l\) 到 \(r\) 的格子颜色种数恰好为 \(x\),问方案数,对 \(10^9+7\) 取模。
\(1\le N,M\le 300\)
考虑容斥,发现没有任何意义,因为不好求的转化出来还是不好求,于是考虑 dp。
思考一种可行性 dp,若处理到 \(i\) 位置,我们可以记录前面 \(i-1\) 个位置的填涂方案,再根据限制看能不能填就行了,是 \(O(n3^n)\) 的。
考虑合并状态,思考我们根据限制看能不能填的时候,最少能用哪些信息。
发现我们判断一个区间的颜色种数,实际上可以去找最右边的一个与 \(i\) 颜色不同的位置 \(j\),如果 \(j\) 在这个区间里面,那就至少有两种颜色。同理我们可以找到第三种不同的位置 \(k\)。
因此我们设计 dp 状态为 \(dp_{i,j,k}\),\(i\) 表示考虑到第 \(i\) 位,最右边的与 \(i\) 颜色不同的位置为 \(j\),最右边的与 \(i\) 和 \(j\) 颜色都不同的位置为 \(k\)。若不存在 \(j\) 或 \(k\) 这种位置,就记作 \(0\)。考虑转移。
- 当下一位填的数与 \(i\) 位置的颜色相同,则 \(dp_{i+1,j,k}\larr dp_{i,j,k}\);
- 当下一位填的数与 \(j\) 位置的颜色相同,则 \(dp_{i+1,i,k}\larr dp_{i,j,k}\);
- 当下一位填的数与 \(k\) 位置的颜色相同,则 \(dp_{i+1,i,j}\larr dp_{i,j,k}\)。
将限制区间右端点排序,每次 check 一下枚举的 \(i,j,k\) 合不合法即可,时间复杂度 \(O(n^3)\)。
ARC059C Children and Candies
现有 \(N\) 个编号为 \(1\) 到 \(N\) 的小朋友,有 \(C\) 颗糖果。若第 \(i\) 个小朋友拿到了 \(a\) 颗糖果,则幸福值为 \(x_i^a\),所有小朋友的活跃度定义为他们幸福值的乘积。
定义 \(f(x_1,x_2,\dots,x_N)\) 为对于所有可能的分糖方式,活跃度之和,给定序列 \(A\) 和序列 \(B\),求
\[\sum_{x_1=A_1}^{B_1}\sum_{x_2=A_2}^{B_2}\cdots\sum_{x_N=A_N}^{B_N}f(x_1,x_2,\dots,x_N) \]对 \(10^9+7\) 取模。
\(1\le N,C\le 400,1\le A_i\le B_i\le 400\)
先考虑怎么求 \(f(x_1,x_2,\dots,x_N)\),即 \(\forall i,A_i=B_i\)。
不好推式子,因此对着实际意义 dp。合并一下状态,定义 \(dp_{i,j}\) 表示 \(1\sim i\) 个小朋友一共发了 \(j\) 颗糖的 \(f\) 值,则可以直接卷积。
是 \(O(n^3)\) 的。
然后考虑暴力的枚举第 \(i\) 个小朋友的 \(x_i\),同样的方法,设 \(f_{i,j}\) 表示第 \(1\) 个到第 \(i\) 个小朋友,发 \(j\) 颗糖的答案。
\(O(n^4)\),过不了。
你发现可以维护形如 \(sum_k=\sum_{x}x^k\) 的一个前缀和,这样就 \(O(n^3)\) 了。
ARC108E Random IS
给定一个 \(n\) 个数的排列,称这个排列的一个子序列是好的,当且仅当它的值递增。
现在将重复以下操作来构造子序列:
- 设 \(k\) 表示有多少个位置满足加入子序列后,子序列仍是好的。
- 若 \(k=0\),结束;否则随机均匀选择一个位置,回到上一个操作。
求期望子序列长度。
\(1\le N\le 2000\)
可以状压,这样子是 \(O(2^n)\) 的。
思考怎么合并状态,寻找一下有无什么好的性质。
你会发现一个位置能不能选,只取决于其左边第一个选的位置和右边第一个选的位置(性质 A)。
因此可以计算 \(w_{i,j}\),表示若 \(i\) 和 \(j\) 选了,\([i+1,j-1]\) 内还有多少个数可以选。这个很好求,用树状数组维护 \(O(n^2\log n)\) 即可。
基于性质 A,这启示我们只要确定了左右第一个选的位置,无论是从全局考虑还是从局部考虑,它的概率是一样的。因此每个区间内都是一个独立的子问题,我们就不用对着时间轴来进行全局决策了,独立进行局部决策,合并即可。
考虑用区间 dp。设 \(f_{i,j}\) 表示在已经选定了 \(i,j\) 两个位置的情况下,期望的选择个数(不算 \(i,j\)),则有转移:
后者实质上是在对着值域 dp,因此也用树状数组维护即可,总时间复杂度 \(O(n^2\log n)\)。
ARC115E LEQ and NEQ
给定一格长度为 \(N\) 的整数序列 \(A_1,A_2,\dots,A_N\),计算满足以下条件的长度为 \(N\) 的整数序列 \(X_1,X_2,\dots,X_N\) 的个数,对 \(998244353\) 取模。
- \(1\le X_i\le A_i\);
- \(X_i\ne X_{i+1}\)。
\(2\le N\le 5\times 10^5\)
题目感觉很容斥啊!其相当于给出了 \(N-1\) 个限制 \(P_1,P_2,\dots,P_{N-1}\)。于是考虑它们的反面也就是 \(\overline{P_i}\),形如 \(X_i=X_{i+1}\)。
考虑计算钦定 \(k\) 个限制 \(\overline{P_i}\) 的方案,记其为 \(f_k\),可得到最后答案为
现在考虑计算它。
思考一下,一个序列中有 \(k\) 处地点满足 \(X_i=X_{i+1}\),我们把这样的点给合并到最前面来,那么最后序列里就会剩下 \(n-k\) 个元素。也就是说等价于这个长 \(N\) 的序列被划分成了 \(n-k\) 个相等段,我们对这个计数就行了。
设 \(dp_{i,j}\) 表示现在考虑到第 \(i\) 位,划分了 \(j\) 段的方案数,最后答案为
则有朴素转移式
2D-1D,时间复杂度 \(O(n^3)\),而且由于是 2D,所以说得在状态上下手。
这里有一个巧妙转化,根据我们的答案式子,我们最后只关心划分出的段数的奇偶,于是有
相当于我们合并了状态,变成 \(O(n^2)\) 了。
1D-1D 了,很有希望啊,看能不能用啥东西来维护啥的。
注意到就因为你这个 \(\min\) 和 \(i\) 有关所以不好优化,然后能自然的想到,我们找到 \(i\) 左边第一个小于 \(a_i\) 的 \(a_{pos}\),然后对于 \([pos+1,i]\) 的部分乘上 \(a_i\) 就可以了。那么对于前面的部分,你发现这个以前你肯定算过啊,就是 \(dp_{pos,p}\),这下牛逼了。
维护一个前缀和与单调栈即可,时间复杂度 \(O(n)\)。
AT_m_solution2019_c Best-of-(2n-1)
A 和 B 玩若干局游戏,每一局,A 胜率为 \(a\),B 胜率为 \(b\),平局概率为 \(1-a-b\)。给定 \(n\),率先累计赢下 \(n\) 局游戏的人获胜,问游戏的期望局数,对 \(10^9+7\) 取模。
\(1\le n\le 10^5\)
考虑 \(a+b=1\),即没有平局的情况。
则我们考虑求游戏进行 \(n+i\) 局的概率,其中 \(0\le i<n\)。这意味着,\(n+i\) 局中有 \(n\) 局是赢者胜,且最后一局是赢者胜,如果是 A 赢,则概率为
因此期望为
考虑 \(a+b<1\),即有平局的情况。
出现平局即会增加许多无谓的局数,发现它大概是一个收敛级数。设 \(k\) 表示期望 \(k\) 轮就会出现一次决定了胜负的局数,则
令 \(a'=\frac{a}{a+b},b'=\frac{b}{a+b}\),此时答案就变成了:
ABC253Ex We Love Forest
给定 \(n\) 个点无边的图和 \(m\) 条待选的无向边。每次等概率从 \(m\) 条边中抽取一条边加入图中,对于 \(i=1,2,\dots,n-1\),依次询问抽取 \(i\) 条边后原图形成一个无环图(即森林)的概率是多少,对 \(998244353\) 取模。
\(1\le n\le 14,1\le m\le 500\)
首先概率转计数。
由于 \(n\) 很小,想到枚举点集 \(S\),然后求其 \(dp_{S,i}\),即点集 \(S\) 连 \(i\) 条边形成森林的方案数。
那么我们肯定得先对点集 \(S\) 的导出子图的生成树计数,设其为 \(f(S)\),可以用 Matrix-Tree 定理,但是我不会。
考虑枚举 \(S\) 的子集,然后合并 \(T\) 和 \(S-T\)。
因为 \(T\) 和 \(S-T\) 是对称的,会被算两遍,所以要除以 \(2\),这里 \(E(S,S-T)\) 表示两个点集间的边数,由于要考虑顺序,所以用插板法乘个 \(\dbinom {|S|-2}{|T|-1}\)。
剩下的就是计算 \(dp_{S,i}\),考虑枚举最后一棵树的子集,于是有。
发现这样会算重啊!因此考虑每次都使 \(S\) 中编号最小的结点在新加入的 \(T\) 中就无虞了,即。
ARC058E 和風いろはちゃん
给定三个正整数 \(X,Y,Z\),称一个长 \(N\) 的序列是俳句的,当且仅当:
- 序列所有元素都是 \(1\) 到 \(10\) 的正整数;
- 存在 \(1\le x<y<z<w\le N\),使得:
- \(\sum_{i=x}^{y-1}a_i=X\);
- \(\sum_{i=y}^{z-1}a_i=Y\);
- \(\sum_{i=z}^{w-1}a_i=Z\)。
给定 \(N\),求有多少个长 \(N\) 的俳句的序列,对 \(10^9+7\) 取模。
\(3\le N\le 40,1\le X\le 5,1\le Y\le 7,1\le Z\le 5\)。
最状压。
通过 \(X+Y+Z\le 17\),我们可以知道其实是可以通过状压的形式来刻画合不合法的。
例如 \(3,2,4\),我们可以状压成 100101000,这样判断合不合法时,只需要判断 \(Z,Y+Z,X+Y+Z\) 这些位上有无 \(1\) 即可。
然后考虑计数,你发现这个要算重,因此考虑从反面看,对完全不俳句的序列计数。
设 \(dp_{i,S}\),表示考虑到第 \(i\) 位,然后最后一小段后缀和对应的 \(17\) 位状压 \(S\),你发现这段后缀只需要保留和小于等于 \(17\) 的部分就行了。
然后用刷表法,枚举第 \(i\) 位用哪个数字,然后判断新状态是否合法,若不合法,则有贡献。
At dwacon6th perlims C Cookie Distribution
一共有 \(N\) 个人,在 \(K\) 天中的第 \(i\) 天,随机在 \(N\) 个人中抽取 \(a_i\) 个互不相同的人发一块饼干。\(c_i\) 为第 \(i\) 个人最后得到的糖果总数,求 \(\prod c_i\) 乘上 \(\prod\binom N{a_i}\) 的期望值,对 \(10^9+7\) 取模。
\(1\le N\le 1000\),\(1\le K\le 20\)。
首先它都乘上 \(\prod\binom N{a_i}\) 了,所以就不是期望。应该是所有抽取方案中,乘积的总和。
有一招高妙的,我们思考 \(c_1\times c_2\times c_3\times\cdots\times c_N\) 的组合意义。那就应该是,对于每个人,我们让它在不同天拿到的饼干中选一个,得到的方案数。即在拿到饼干的日子里选一天。
这样我们设 \(dp_{i,j}\) 表示,在第 \(i\) 天之前,有 \(j\) 个人已选出自己饼干的方案数。
时间复杂度 \(O(n^2k)\)。
ARC116E Spread of Information
给定一棵大小为 \(N\) 的树和一个整数 \(K\)。
定义某个点离关键点的距离,为这个点到任一关键点距离的最小值。 最小化离关键点最远结点的距离。
\(1\le K<N\le 2\times 10^5\)。
容易想到二分答案,这样转化成了一个,树上 \(x\) 半径最小覆盖问题。怎么做呢?
首先有一种贪心的想法。就是假如说 \(u\) 子树中有一个点 \(p\),还没被覆盖到,我们就把这个点的问题踢皮球,踢到这个点的 \(x\) 级祖先去,相当于一个 ddl。然后如果在 \(u\) 到 \(p\) 的 \(x\) 级祖先中顺便就把这个点覆盖了,那挺好;否则就要选 \(x\) 级祖先。
贪心证明找个时间补。
有了这个就好做了。从下往上 dp,维护这个子树中最远没有被覆盖到的点的距离 \(f_u\),以及离这个点最近的标记点的距离 \(g_u\)。分讨。
-
\(f_u+g_u\le x\),说明这个子树内连最远的点也能覆盖到了,那么 \(f_u\) 值设为极小值。
-
否则:
- \(f_u=x\):说明 \(u\) 是这个未被覆盖的点的 \(x\) 级祖先,那么这时候就只能标记 \(u\) 点了。此时 \(f_u\) 为极小值,\(g_u\larr 0\)。
- 否则说明有覆盖不到的点,只是事态不紧急。但如果 \(u\) 没覆盖到,即 \(g_u>x\),那么就得 \(f_u\larr \max(f_u,0)\) 了。
ARC124E Pass to Next
有 \(N\) 个人围成一圈,编号为 \(1,2,\dots,N\),最初第 \(i\) 个人持有 \(a_i\) 个球。
接着它们将执行以下操作:每个人选中自己拥有的若干球(可以不选),然后同时将选中的球向下一个人传递,最后生成一个表示第 \(i\) 个人当前持有多少球的新序列。求所有可能序列元素积之和。对 \(998244353\) 取模。
\(3\le N\le 10^5\),\(0\le a_i\le 10^9\)。
我们考虑研究操作序列,这里的操作序列表示的是第 \(i\) 个人向后传递多少球,这个要好研究一点。
然后可以发现:当操作序列整体加一或减一时,得到的最终序列不变。这意味着,至少有一个人没传的操作序列与最终序列形成了双射。
我们会在 dp 过程中将大家都传了的方案进行容斥,这会先不管。
这里因为是序列之积,这很容易让人想到从组合意义的角度去刻画它:在这里它的组合意义,就是在传递操作过后,每个人从自己拥有的球中选择一个的方案数。
由于球数,即值域过大,放在状态里是不可行的。因此考虑每个球的来源,要不然,一个人选择的是自己本来就有的球;要不然,一个人选择的就是别人传过来的球。
你发现通过这样的划分,前者可选的数量,只和下一个人有关。而后者剩余的数量,则只与上一个人有关。两者之间是互不相关的,因此可以分别 dp。
设 \(dp_{i,0/1}\),表示:
- \(dp_{i,0}\):第 \(i\) 个人选择自己原有的球,前 \(i-1\) 个人选球的方案。(用这种设计的原因是,选择自己的原有的球是和下一个人有关的,因此我们对于 \(i\) 的贡献,放到 \(i+1\) 去考虑)
- \(dp_{i,1}\):第 \(i\) 个人选择前一个人传过来的球,前 \(i\) 个人选球的方案。
转移方程为:
表示我们枚举第 \(i\) 个人留了多少球,假设是 \(j\)。则当 \(j\ge 1\) 时,会有 \(dp_{i,0}\times j+dp_{i,1}\);然后 \(j=0\) 时就只会选传来的球。
同理有:
然后考虑容斥,你发现只要把第一个转移式子中,\(j=a_i\) 的情况排除掉就得到了所有人必须传球的方案数,然后用总的减去这个就行了。
最后处理这个环。我们依次计算第 \(1\) 个人是选的自己的,还是选的 \(n\) 号点的,然后加起来就可以了。
ARC096C Everything on It
有一个面馆,有 \(N\) 种配料可加,即有 \(2^N\) 种面可以点。
一个人来点若干碗面,满足以下要求:
- 不能点配料完全一致的拉面;
- 每种配料至少出现在两碗面中间。
给定 \(N\),求点面方案数,对一个质数 \(M\) 取模。
\(2\le N\le 3000\)
第二个限制太诡异,考虑设钦定 \(k\) 个调料出现次数 \(\le 1\) 的方案数为 \(f(k)\),则答案为
考虑计算 \(f(k)\)。
对于钦定的这 \(k\) 个调料,它们的出现次数最多一次。枚举 \(i\),表示将它们划分成几个集合,如果出现次数都为 \(1\) 次的话,那就是 \(\begin{Bmatrix}k\\i\end{Bmatrix}\)。但是由于是最多一次,那么有些元素可以不出现,我们单独划出一个不出现元素的集合即可,在这个集合里提前放一个元素防止为空。根据这个集合意义,得到 \(\begin{Bmatrix}k+1\\i+1\end{Bmatrix}\)。
考虑计算剩余调料,首先仅由它们组成的还有 \(2^{N-k}\) 种拉面,然后我们会选其中一些拉面,方案数为 \(2^{2^{N-k}}\)。然后我们还可以选这些调料被包含在这 \(i\) 个集合中的部分,这 \(i\) 个集合中,每个集合都有 \(2^{N-k}\) 的贡献,所以再乘上一个 \(2^{i\times (N-k)}\)。
答案为
\(O(n^2)\) 预处理组合数及第二类斯特林数即可。
贪心
AT nk19q E Weights on Vertices and Edges
有一张 \(n\) 个点 \(m\) 条边的连通无向图,点有点权,边有边权。现在要删除若干条边(可以不删),使得剩下的图满足对于,没有被移除的边,其所在连通块中的点的点权和大于等于该边的边权。
\(1\le N,m\le 10^5\)
相当于最多能保留多少。
用归纳法的思想,考虑假如边 \(e\) 可以保留,有哪些边可以保留。那么你会发现,在边权小于等于 \(w_e\) 的子图中,边 \(e\) 所在的连通块是全都可以保留的。相当于我们进行了一个按照边权从大到小的归纳。
然后考虑找到一些显然可以保留的边,作为归纳的基础(或者说是边界)。也即,在边权小于等于 \(w_e\) 的子图中,边 \(e\) 所在连通块点权大小和比它大,那就是肯定可以选的。
那如何证明,偏偏选了这一类边作为基础,就一定可以通过归纳覆盖到所有可以保留的边呢?考虑最后答案对应的图,对于每个连通块我们找到它边权最大的边,你会发现其一定满足:
- 所在连通块其它边边权比它小;
- 连通块点权和大于等于这条边。
对于实现,先按边权从小到大排序,然后依次加入,用并查集维护。假如说碰到了满足上述条件的边,那么我们就把这条边,以及其所在连通块中还未被计入答案的边,都计入答案。时间复杂度 \(O(m\log m)\)。
ds
ARC082D Sandglass
现在有一个沙漏,每秒漏 \(1\) 单位沙子,一共有 \(X\) 单位沙子,且 \(A\) 部分最初有 \(a\) 单位沙子,在上半部分。
给定序列 \(r\),\(r_i\) 表示在第 \(i\) 秒时,沙漏会被翻转一次。
有 \(Q\) 次询问,每次询问 \(t_i,a_i\),表示当 \(a=a_i\) 时,第 \(t_i\) 秒 \(A\) 部分的沙子数。
\(10^5\)
首先考虑把操作和查询放一起,按照时间来扫一遍,并同时维护每个 \(a_i\) 的答案。如果暴力维护的话,就是大家该加加,该减减,如果 \(<0\) 或者 \(>X\) 判断一下就行了。
我们将 \(m\) 个询问的 \(a_i\) 排序,那么如果现在是减,那么你会发现它一定是一段前缀被覆盖为 \(0\),其余正常减就行了,加法同理。
博弈论
AGC064C Erase and Divide Game
高桥和青木玩游戏,现在黑板上有一些数,由 \(N\) 个不交的区间表示。
高桥先手,两人轮流操作,删掉这些数里面的奇数/偶数,再对每个剩下的数施以 \(x\leftarrow\left\lfloor\dfrac x2\right\rfloor\),无法操作的人输。
假设两人都按照最优策略,问谁赢。
\(N\le 10^4,0\le V\le 10^{18}\)。
假如说黑板上只是单个的数,怎么做?
考虑从低位到高位建一棵 01-Trie,每次相当于往下走一格,谁走出去谁赢。这样直接从底往上按题意合并胜负状态,就行了。
区间就有点棘手了,因此我们只能考虑一种整体合并的方法。
称根节点在第 \(0\) 层,若在第 \(k\) 层,能合并的结点对应的数一定为 \(x\) 和 \(x+2^{k-1}\)(可以画图)。因此我们将整个 \([0,2^k)\) 拆成两半,然后两边区间用双指针做归并即可。
具体来说,我们首先把当前手上的所有区间拿出来,把包含于 \([0,mid]\) 的放一堆,包含于 \((mid,2^k)\) 放一堆,如果跨过 \(mid\) 拆成两半放即可,然后一步步归并,得到新的一些区间,进入下一轮循环。
有个重点,对于空点要单独设状态,按理来说空点与空点合并还是空点,而空点与其它任何点合并都可以变成必胜点,因为可以直接走出去了。
Ad-hoc
ARC137D Prefix XORs
给定一个长 \(N\) 的序列 \(A\),以及一个整数 \(M\),对于每个 \(k=1,2,\dots,M\),求 \(A\) 的 \(k\) 阶前缀异或和。
\(1\le N,M\le 10^6,0\le A_i<2^{30}\)。
找规律。
注意到我找规律找了半天,发现找的是后缀和的规律,所以最后做的时候把数组倒过来了。
考虑对每阶后缀和,我们去看一下有哪些数贡献了答案。按理来说,这个数前面有多少个 \(1\),就说明它被贡献了几次,然后列出一张 \(n=8,m=8\) 的表。

然后启用观察力,你发现这个是个完美的分形结构。

考虑它的第一层分形,三个为 \(1\) 的坐标分别为 \((0,0),(0,1),(1,0)\),为 \(0\) 的坐标为 \((1,1)\)。
考虑它的第二层分形,如果一个坐标要为 \(1\),那么在二进制表示下,它的二进制最低位不能为 \((1,1)\),这是为了满足第一层分形结构;而它的二进制第二位不能为 \((1,1)\),这是为了满足第二层分形结构。
因此,令 \(k=\log_2n\)。则对于这 \(k\) 位中的每一位,都满足它的横纵坐标不同时为 \(1\),换句话说 \(x \operatorname{and} y=0\)。
也就是说,在第 \(x\) 排,能产生的贡献的,就是 \(\operatorname{not} x\) 的所有子集,因此做一个高维前缀和即可。

浙公网安备 33010602011771号