有意思的题——做题记录

从 2026.3.26 开始写,记录一些有意思的题目。

P3641 [APIO2016] 最大差分

考虑先花 \(n + 1\) 的代价找到 \(a_1,a_n\)

那么显然 \(\max(a_i - a_{i-1})\ge \frac{a_n - a_1}{n- 1}\)。那么值域上每 \(\frac{a_n-a_1-1}{n-1}\) 分一段,显然最后答案只会是不同段之间的差值最大值。这样一共有 \(O(n)\) 段,每个数一定会被查 \(1\) 次,算上之前的代价就是 \(3n\) 的。

AT_agc013_d [AGC013D] Piling Up

考虑取一次对两种颜色的影响。记 \(c\) 为红色的数量,那么 \(n-c\) 为蓝色的数量。记 \(R\) 为红色,\(B\) 为蓝色。

  1. \(RR\)\(c \to c-1\)。要求之前 \(c \ge 1\)
  2. \(RB\)\(c \to c\)。要求之前 \(c \ge 1\)
  3. \(BR\)\(c \to c\)。要求之前 \(c \le n-1\)
  4. \(BB\)\(c \to c + 1\)。要求之前 \(c \le n-1\)

不妨令初始时 \(c =0\),那么可以按照上面的操作得到 \(h_i\) 表示执行完第 \(i\) 轮后 \(c\) 的值。那么对于一个最终合法的 \(c_0\),应该满足:

  1. 对于所有 \(R*\) 操作的 \(i\),有 \(h_i + c_0 \ge 0\)。这里本来应该是 \(\ge 1\),但是执行 \(c \to c-1\) 后就变成 \(0\) 了。
  2. 对于所有 \(B*\) 操作的 \(i\),有 \(h_i + c_0 \le n\)。同上。

分情况讨论:

  1. 存在 \(R*\) 操作且 \(h_i < 0\)。那么此时如果该方案合法一定存在一个 \(c_0\)(也是最小的)使得 \(\min(h_i) + c_0 =0\)。这里 \(\min(h_i)\) 表示的是 \(R*\) 操作的 \(h\) 最小值。
  2. 不存在 \(R*\) 操作且 \(h_i < 0\)。此时直接让 \(c_0=0\) 一定合法。

那么这样就可以对所有方案构造映射了,有 \(f(G) = c_0\),其中 \(c_0\) 是最小可行的值。考虑分两类计数。

  1. 对于情况 \(1\)。维护 \(f_{i,j,0/1}\) 表示当前执行完前 \(i\) 轮操作,\(c = j\),且是否存在 \(R*\) 操作且 \(h_i + c_0 = 0\)。那么:

    \[f_{0,c_0,0} = 1[1 \le c_0 \le n]\\ \]

    1. \[f_{i, j - 1,0}\gets f_{i - 1,j,0}[j > 1] (R)\\ f_{i,j-1,1}\gets f_{i - 1,j,0} [j = 1] (R)\\ f_{i,j - 1,1}\gets f_{i - 1,j,1} [j \ge 1] (R)\\ f_{i, j,0/1}\gets f_{i-1,j,0/1} [j \le n-1](B)\\ \]

    2. \[f_{i,j + 1,0/1}= f'_{i,j,0/1} \]

    3. \[f_{i, j - 1,0}\gets f'_{i,j,0}[j > 1] (R)\\ f_{i,j-1,1}\gets f'_{i,j,0} [j = 1] (R)\\ f_{i,j - 1,1}\gets f'_{i,j,1} [j \ge 1] (R)\\ f_{i, j,0/1}\gets f'_{i,j,0/1} [j \le n](B)\\ \]

    最后答案就是 \(\sum f_{m,j,1}\)。复杂度 \(O(nm)\)

  2. 对于情况 \(2\)。定义同上。有:

    \[f_{0,0} = 1 \]

    1. \[f_{i,j - 1}\gets f_{i-1,j} [j \ge 1](R)\\ f_{i,j}\gets f_{i-1,j} [j \le n-1](B) \]

    2. \[f_{i,j+1}= f'_{i,j} \]

    3. \[f_{i,j - 1}\gets f'_{i,j} [j \ge 1](R)\\ f_{i,j}\gets f'_{i,j} [j \le n](B) \]

    答案为 \(\sum f_{m,j}\)。时间复杂度 \(O(nm)\)

最后把两个加起来就行了。

其实可以合一起,第二个相当于初始化 \(f_{0,0,1}=1\)

AT_agc002_f [AGC002F] Leftmost Ball

考虑判断一种方案是否合法。应该满足对于任意前缀 \(1\sim i\),都有 \(0\) 的数量不小于颜色数量,且最后每种颜色恰好出现了 \(k-1\) 次。

考虑定义两种方案本质相同,当仅当 \(0\) 的位置相同,且出现位置集合构成的集合相同。比如 \(0012\)\(0021\) 是相同的。那么我们就只需要求有多少本质不同的方案,再乘上 \(n!\) 即可。

此时第 \(i\)\(0\) 可以直接视为颜色 \(i\) 的开头。那么就可以用插入的方式生成序列了。具体的,定义 \(f_{i,j}\) 表示插入完颜色 \(1 \sim i\),且 \(i\) 这个颜色 \(0\) 的位置在 \(j\) 的方案数。则我们只需要保证插入 \(i + 1\) 这个颜色后颜色第一次出现的位置在 \(j\) 后面即可。有:

\[f_{i+1,k}\gets f_{i,j}\times \binom{i\times K -k + (K - 1)}{K - 1}[j < k] \]

前缀和优化即可。最后答案就是 \(n!\sum f_{n,i}\)。但是时间复杂度是 \(O(n^2K)\) 的。

换个角度,不看做是在插入,而是看做确定位置。那么如果已知颜色 $1\sim i $ 占了哪些位置,一定可以知道 \(i+1\) 的开头在哪里,也就是第一个还没被占的位置。那么对于剩下 \(K-1\) 个数,剩余位置有 \(n\times K - i \times K - 1\) 个。所以可以定义 \(f_i\) 表示前 \(i\) 个颜色的方案数,则 \(f_i = f_{i-1}\times \binom{(n-(i-1))\times K - 1}{K -1}\)。答案仍然是 \(n!\sum f_{n}\)。复杂度 \(O(n^2)\)。瓶颈在于组合数。

发现过不了样例,问题在于 \(0021\) 是不应该被计算的(和他本质相同的是 \(0012\)),但插入 \(1\) 的时候选择 \(1,4\) 位置就使得它被计算了。

此时应该再添加一个限制:对于任意颜色 \(i\),它前两次出现的位置 \(p_1,p_2\) 中间不能存在 \(j >i\),使得 \(j\) 出现至少 \(2\) 次。

那么可以定义 \(f_{i,j}\) 表示前 \(i\) 个颜色填完,当前第一个空往后数 \(j\) 空位都有这个限制的方案数。那么枚举 \(i\) 这个颜色放在第几个空位,有:

\[f_{i,j - 2} \gets f_{i-1,k}\times \binom{n\times K - (i-1)\times K -j}{K - 2} [k \le j - 1] \]

前缀和优化即可,由于最后答案为 \(n! f_{n,0}\),所以第二位是 \(O(n)\) 量级的。时间复杂度 \(O(n^2)\)

P3447 [POI 2006] KRY-Crystals

考虑对于每个 \(i\),找到最大的 \(j\),使得 \(a_i\)\(m_i\)\([j,31]\) 位相同。

\(j\) 最大的那个下标为 \(i_0\),且对应的 \(j\)\(j_0\)。那么如果 \(\bigoplus \limits_{i=1}^{n}a_i =0\),一定有对于 \(j \in [j_0,31]\)\(\bigoplus\limits_{i=1}^{n}m_{i,j} =0\)

显然,\(m_{i_0,j_0 - 1} = 1\)\(a_{i_0,j_0-1}=0\)。对于 \([0,j_0 - 2]\) 这些位,由于 \(a_{i_0}\) 是可以取到 \([0,2^{j_0-1}-1]\) 的,所以对于 \([1,i_0)\cup (i_0,n]\) 中所有数,无论它们值是多少,都是可以对应唯一的 \(a_{i_0}\) 的,因为在不管 \([j_0-1,31]\) 这些位时,\(\bigoplus \limits_{i\ne i_0}^{}a_i = a_{i_0}\)。则现在只需要考虑 \(j_0 - 1\) 这一位异或和为 \(0\) 的情况了,不是直接判断 \(\bigoplus\limits_{i=1}^{n}m_{i,j_0-1}\) 的原因是可能有多个 \(i\) 对应的 \(j\)\(j_0\),此时应该异或 \(0\) 而不是 \(1\)

枚举 \(j_0 - 1 = x\)。定义状态函数 \(f_{i,0/1,0/1}\) 表示前 \(i\) 个数,当前异或和为 \(0/1\),不存在或存在一个 \(i_0\) 对应的 \(j\)\(x+1\) 的价值和。

  1. \(m_{i,x} = 0\)\(f_{i,j,k} = f_{i-1,j,k} \times (1 + (m_i \& (2^{x} - 1)))\)
  2. \(m_{i,x} = 1\)
    1. \(a_{i,x} = 1\)\(f_{i,j,k} \gets f_{i-1,j\oplus 1,k} \times (1 + (m_i \& (2^{x} - 1)))\)
    2. \(a_{i,x} = 0\)
      1. 之前不存在这样的 \(i_0\)\(f_{i,j,1}\gets f_{i-1,j,0}\)
      2. 之前存在这样的 \(i_0\)\(f_{i,j,1}\gets f_{i-1,j,1} \times 2^x\)

最后答案就是 \(f_{n,0,1}\)。时间复杂度 \(O(n\log V)\)

P10104 [GDKOI2023 提高组] 异或图

如果 \(m = 0\),那就是 P3447。只需要添加一个 \(a_{n+1}\),差分一下。复杂度是 \(O(n\log V)\) 的。

如果 \(m \ne 0\),尝试容斥。我们去钦定一些边不合法,记边集为 \(S\)。这样可以以 \(O(n\log V)\) 的时间复杂度算出 \(g(S)\) 表示 \(S\) 中的边一定不合法时的方案数。要求 \(f(\emptyset)\)。显然,容斥系数应该是 \((-1)^{|S|}\)。有 \(f(\emptyset) = \sum\limits_{S \subseteq E}^{} (-1)^{|S|}g(S)\)。但是 \(m \le \frac{n(n-1)}{2}\)

考虑钦定一些点相同,对于一个联通块 \(U\),它会对所有满足通过边集 \(S\) 连接能够得到 \(U\)\(S\) 产生贡献,且贡献是一定的。那么 \(U\) 的容斥系数就可以是 \(\sum\limits_{S}^{}(-1)^{|S|}\)

考虑维护 \(h_U\) 表示 \(U\) 集合中的点联通时容斥系数的和。

因为对于 \(U\) 中点都相同的情况,我们最终的限制应该是 \(a = \min\limits_{x\in U}^{} a_x\)。不妨将 \(a\) 升序排序。定义状态函数 \(f_{S,s}\) 为现在集合中点集为 \(S\),且有限制的点集为 \(s\) 的贡献和。考虑去枚举新加进来的集合 \(U\) 的 lowbit,记为 \(i\)。那么有转移方程:

\[f_{U' \cup U, s \cup \{i\}} \gets f_{U',s} \times h_{U} [|U|\bmod 2 = 1]\\ f_{U' \cup U, s } \gets f_{U',s} \times h_{U} \times (a_i + 1) [|U|\bmod 2 = 0]\\ \]

这里有两种转移方程是因为如果钦定偶数个数值相同,异或一定是 \(0\)。这部分枚举量是 \(\sum\limits_{i=1}^{n}3^{n-i}2^i\) 也就是 \(O(3^nn)\) 级别的。因为 \([1,i-1]\) 一定已经在 \(U'\) 中,是不需要枚举的,只需要在意 \([i + 1,n]\) 哪些数在 \(U'\),哪些数在 \(U\)

对于答案,就是 \(\sum\limits_{s}^{}f_{U,s} \times w(s)\),其中 \(w(s)\) 为只有 \(s\) 中的点产生限制时的方案数。这部分时间复杂度 \(O(2^nn\log V)\)

\(h_U\) 的计算是相对容易的。依旧考虑容斥,首先 \(h_{U} = \sum \limits_{S}^{} (-1)^{|S|}\),记 \(E(U)\) 为原图上 \(u \in U\land v\in U\) 的边的数量,那么 \(h_U = [E(U) = 0]\)。则 \(h_{U} = [E(U) = 0] - \sum\limits_{\min(U) \subseteq T \subset U}^{} h_{T} \times [E(U/T) =0]\)。时间复杂度 \(O(3^n)\)

总复杂度 \(O(3^nn + 2^nn\log V)\)

实现细节。显然 \(f_{*,*}\) 的空间是 \(O(4^n)\) 的。但是对于 \(i\) 来说,\([1,i-1]\) 只需要存哪些是 \(s\) 中的,\([i+1,n]\) 也只需要知道哪些是 \(U\) 中的,所以可以把两个状态压在一起,空间变成 \(O(2^n)\)

P4921 [MtOI2018] 情侣?给我烧了!

\(n\) 种颜色,每种颜色 \(2\) 个。将它们重新排列,求最后 \(p_{2i}=p_{2i+1}\) 的数量恰好为 \(k\) 的方案数。

定义 \(G(n)\) 表示 \(n\) 种颜色产生 \(0\) 对相邻的同色对的方案数。那么对于产生 \(k\) 对的方案数,就是 \(\binom{n}{k}\binom{n}{k}k! 2^k \times G(n-k)\)

那么只需要求出 \(G(n)\) 就可以了。考虑每次在最开头加一对异色点,方案数为 \(n(n-1)\)。有两种情况:

  1. 这一对一色点另外一半也是一对。那么只需要考虑 \(n-2\) 种颜色的方案数,为 \(2(n-1)G(n-2)\)。其中 \(2(n-1)\) 表示这一对可交换,且能差在 \((n-1)\) 个空任意一个中。
  2. 不是一对,相当于强制它们同色(不在一起),为 \(G(n-1)\)

\(G'(n) = 4n(n-1)(2(n-1)G(n-2)+G(n-1))\)

时间复杂度 \(O(Tn)\)

CF1874F Jellyfish and OEIS

首先,对于两个区间 \([l_1,r_1],[l_2,r_2]\),若满足 \(l_1 < l_2 \le r_1 < r_2\),且 \(p[l_1,r_1]\)\(p[l_2,r_2]\) 均为排列,这 \(p[l_2,r_1]\) 也一定为排列。因为考虑一个数 \(x \in[l_2,r_1]\),若 \(pos_x \in(r_1,r_2]\),则 \(p[l_1,r_1]\) 一定不是排列(不包含 \(x\)),反之同理。则所有 \(x \in [l_2,r_1]\) 的数都满足 \(pos_x \in [l_2,r_1]\),那么 \(p[l_2,r_1]\) 是排列。

考虑维护从 \(R_i\) 表示最小的 \(r\),使得 \(p[i,R_i]\) 是排列,若不存在则 \(R_i = i-1\)。那么所有真区间 \([i,R_i]\) 不交。

尝试根据这个性质 DP。定义 \(f_{l,r}\) 表示 \(p[l,r]\) 是排列,且满足题目条件的方案数。因为真区间 \([i,R_i]\) 不交,所以可以考虑枚举有多少个不合法的真区间,记 \(g_{l,r,x}\) 为钦定 \(x\) 个真区间不合法的方案数,则 \(f_{l,r}=\sum\limits_{x=0}^{r-l+1}(-1)^xg_{l,r,x}\)

考虑怎么维护这个 \(g_{l,r,x}\)。显然不能随便钦定,比如我们钦定了两个区间 \([l_1,r_1],[l_2,r_2]\),且 \(r_1 < l_2\),但存在 \(r_1 < l_3 <l_2 < r_3 < r_2\),且 \(p[l_3,r_3]\) 也是排列,这时应该变成 \([l_1,r_1],[l_3,l_2 - 1],[l_2,r_3],[r_3+1,r_2]\)

但是如果 \([l_1,r_1],[l_2,r_2]\) 是不合法的,那么 \([l_1,r_1],([l_3,l_2 - 1]),[l_2,r_3],([r_3+1,r_2])\) 也是不合法的,记 \([l_1,r_1],[l_2,r_2]\) 的容斥系数为 \(x\),那么就是 \(x + x +(-x) + (-x) +x = x\)。也就是说加入 \([l_3,r_3]\) 后再拆成不交区间会抵消掉。若以直接钦定是可行的。

因为我们只在意钦定不合法区间的奇偶性,所以可以定义 \(g_{l,r,x}\) 表示区间 \([l,r]\),钦定了若干个不合法区间,且最后有 \(x\) 个点没有被区间包含的方案数乘上容斥系数的和。对于 \(g_{l,r,x}\)

  1. \(r\) 是没被区间包含的点。\(g_{l,r,x}\gets g_{l,r-1,x-1}\)
  2. \(r\) 是被包含的点。那么新的这个钦定的区间一定满足 \(R_i=r\)。枚举 \(i\),则 \(g_{l,r,x}\gets (-1)(r-i+1)!g_{l,i-1,x} [ m_i \ge r]\)
  3. 初始化 \(g_{l,l-1,0}=1\)

那么 \(f_{l,r}=\sum\limits_{x=0}^{r-l+1}g_{l,r,x}\times x!\)。时间复杂度 \(O(n^4)\)

但是这么做第二个样例会输出 \(39\)。好像是确实不能随便钦定导致的,上面的证明有点莫名其妙地假。

既然不能直接钦定,考虑构造映射。具体地,对于 \(p[l,r]\),我们维护 \(\{[i,R_i]| R_i \ge i\}\),根据最开始的证明,这些区间不交。那么显然一个 \(p[l,r]\) 只会对应一个集合。再细化,我们将所有 \(m_i < R_i\)\([i,R_i]\) 删了,则 \(p[l,r]\) 只会对应一个不满足条件的区间集合。尝试对这个计数。

依旧把容斥系数乘进去,定义 \(f_{l,r}\) 表示 \(p[l,r]\) 是排列,且不考虑 \([l,r]\)\(m_l\) 限制时合法的方案数。\(g_{l,r,x}\) 为得到区间长度和为 \(r-l+1-x\) 也就是有 \(x\) 个位置没被包含的方案数乘上容斥系数的和。则 \(f_{l,r}=\sum\limits_{x=0}^{r-l+1}g_{l,r,x}\times x!\)。对于 \(g_{l,r,x}\),有:

  1. \(r\) 没被包含。\(g_{l,r,x}\gets f_{l,r-1,x}\)
  2. \(r\) 被包含。则 \(R_i = r\)。枚举 \(i\),有 \(g_{l,r,x} \gets (-1)g_{l,i-1,x}\times f_{i,r} [m_i \ge r]\)。其中 \(l < i \le r\)。因为 \([i,R_i]\) 是一个集合中的区间,所以一定不存在 \(i < l' \le r' < R_i\),使得 \(p[l',r']\) 是排列且 \(m_{l'}\ge r'\)。那么方案数就是 \(f_{i,r}\) 了。
  3. \(g_{l,l-1,0}=1\)
  4. \(m_l \ge r\),则 \(g_{l,r,0}\gets (-1)f_{l,r}\)

时间复杂度 \(O(n^4)\)

CF2048H Kevin and Strange Operation

显然最后每个位置将会是原来序列上一段区间的 \(\max\)

记当前序列上第 \(i\) 个数是原序列 \([l_i,r_i]\) 的最大值。

考虑操作一个位置 \(p\)。有:

  1. \(r_i\) 变成 \(r_{i+1}\),对于 \(1 \le i < p\)
  2. 删掉 \([l_p,r_p]\)

那么相当于是将 \([l_1,r_1],[l_2,r_2],\dots,[l_m,r_m]\) 变成 \([l_1,r_2],[l_2,r_3],\dots,[l_{p-1},r_p],[l_{p+1},r_{p+1}],\dots,[l_m,r_m]\)

\(l,r\) 看作两个序列,那么操作 \(p\) 就会让 \(r_1\) 删掉,让 \(l_p\) 删掉。初始时 \(l_i = i,r_i = i\)

因为 \(r\) 是删前缀的过程,\(l\) 是删子序列的过程。所以考虑判定一个序列是否合法。具体地,如果这个序列长度为 \(m\),那么可以知道 \(r_i = n - i +1\)。维护 \(l_i\) 表示从后往前尽可能少地移动 \(l\),匹配到第 \(i\) 个时 \(l\) 的值。那么 \(l_i\) 应该是 \([1, \min(l_{i+1},n-i+1)]\) 中最大的一个 \(j\),使得 \(\max\limits_{k=j}^{n-i+1}a_k = b_i\)。显然,不合法当且仅当某一个 \(i\) 时不存在这样的 \(j\) 了。

这启发我们去维护这个 \(l\)。定义状态函数 \(f_{i,j}\) 表示后面 \(i\) 个数都保留下来了,当前的 \(l\)\(j\) 且合法的方案数。分类转移:

  1. \(b\) 序列中这一位是 \(0\)。找到 \(i\) 前面第一个 \(1\) 的位置 \(j\)。首先要满足 \(a_i =0\)
    1. \(l_{i+1} > i\)\(f_{i,i} \gets \sum\limits_{j > i}^{}f_{i+1,j}\)
    2. \(j + 1 < l_{i+1} \le i\)\(f_{i,k - 1}\gets f_{i+1,k}\)
    3. \(l_{i+1} \le j+1\)。不合法。
  2. \(b\) 序列这一位是 \(1\)。找到 \(i\) 前面第一个 \(1\) 的位置 \(j\)
    1. \(j < l_{i+1}\)\(f_{i,j}\gets \sum\limits_{k>j}^{}f_{i+1,k}\)
    2. \(l_{i+1} \le j\)\(f_{i,k - 1}\gets f_{i+1,k}\)

最后答案就是 \(\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{i}f_{i,j}\)。直接做时间复杂度 \(O(n^2)\)

将这两个转移合在一起,有:

  1. \(f_{i,k} = [a_i = 0] f_{i+1,k+1}\),对于 \(k=i\)
  2. \(f_{i,k} = [a_i=0]f_{i+1,k+1}\),对于 \(j < k \le i - 1\)
  3. \(f_{i,k} = \sum\limits_{x = k + 1}^{i+1}f_{i+1,x}\),对于 \(k=j\)
  4. \(f_{i,k} = f_{i,k+1}\),对于 \(k < j\)

明显是一个整体 DP 的形式。首先这个平移是整体平移的,所以可以不管。维护 \(\delta_i = n-i\) 表示平移量。

首先 \(k -\delta_i > i\)\(f\) 值和 \(k - \delta = 0\)\(f\) 值需要清空。也就是 \(f_{k} = 0[k > i+\delta_i\lor k = \delta]\)

其次如果 \(a_i \ne 0\)\(f_{k} = 0[k > j +\delta_i ]\)

最后对于 \(k = j + \delta_i\),有 \(f_{k} = \sum\limits_{x = k}^{n}f'_x\)

线段树维护可以做到 \(O(n\log n)\)

CF2048G Kevin and Matrices

比 H 难,不支持反驳。

考虑判定一个矩阵是否合法。假设第 \(i\) 行的最大值不大于第 \(j\) 列的最小值。那么说明第 \(i\) 行的最大值和第 \(j\) 列的最小值都是 \(a_{i,j}\)。因为如果第 \(i\) 行的最大值不是 \(a_{i,j}\),则存在 \(a_{i,k} > a_{i,j}\),而第 \(j\) 列的最下值 \(\le a_{i,j}\),显然不合法。反之同理。

那么一个矩阵合法,当且仅当存在 \((i,j)\),使得 \(a_{i,j}\) 是第 \(i\) 行的最大值也是第 \(j\) 列的最小值。

发现如果 \((i_1,j_1)\) 合法,\((i_2,j_2)\) 也合法,且 \((i_2,j_2)\)\((i_1,j_1)\) 右上角,一定满足 \(a_{i_1,j_1} = a_{i_2,j_2}\)。左上角也是一样的。也就是说,这样合法的 \((i,j)\) 的值一定都相同。同时,\((i_2,j_1)\)\((i_1,j_2)\) 也是合法的。

也就是说,只要我们知道哪些行上有合法点,记为集合 \(A\);哪些列上有合法点,记为 \(B\)。那么 \((i,j),i\in A,j\in B\) 一定是合法点。

那么考虑对这玩意容斥。钦定有 \(i\)\(j\) 列上存在合法点。容斥系数应该是 \((-1)^{i+j}\)。枚举这个相同的值 \(k\),那么每行都有至少 \(j\) 个数是 \(k\),且剩下的数不超过 \(k\);每列都有至少 \(i\) 个数是 \(k\),且剩下的数不小于 \(k\)。不难发现除去这 \(i \times j\) 个一定是 \(k\) 的数后,剩下每行每列的数位置都是互不相同的,于是方案数为 \((v - k +1)^{j\times n - i\times j}\times k ^{i\times m -i\times j}\times v^{(n-i)(m-j)}\)

那么答案为:

\[\sum\limits_{k=1}^{v}\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}(-1)^{i+j}(v-k+1)^{j (n-i)}k^{i (m-j)} v^{(n-i)(m-j)}\binom{n}{i}\binom{m}{j}\\ \sum\limits_{k=1}^{v}\sum\limits_{i=1}^{n}(-1)^{i}\binom{n}{i}\sum\limits_{j=1}^{m}(-1)^j (v-k+1)^{j(n-i)}k^{i(m-j)}v^{(n-i)(m-j)}\binom{m}{j}\\ =\sum\limits_{k=1}^{v}\sum\limits_{i=1}^{n}(-1)^{i}\binom{n}{i}\sum\limits_{j=1}^{m}(-1)^j ((v-k+1)^{(n-i)})^j({k^i})^{(m-j)}({v^{(n-i)}})^{(m-j)}\binom{m}{j}\\ =\sum\limits_{k=1}^{v}\sum\limits_{i=1}^{n}(-1)^{i}\binom{n}{i}\sum\limits_{j=1}^{m}(-(v-k+1)^{(n-i)})^j(k^i{v^{(n-i)}})^{(m-j)}\binom{m}{j}\\ =\sum\limits_{k=1}^{v}\sum\limits_{i=1}^{n}(-1)^{i}\binom{n}{i}(-(k^iv^{(n-i)})^m+(k^iv^{(n-i)}-(v-k+1)^{(n-i)})^m)\\ \]

时间复杂度 \(O(nv\log m)\)

P14686 [ICPC 2025 Yokohama R] Charity Raffle

考虑对一种获得奖品的方案的合法性判定。

可以这么构造:

  1. 如果当前值剩下一种奖品 \(x\)
    1. 存在 \(y > x\),且初始时 \(cnt_y = cnt_x - 1\)。合法。
    2. 不存在。不合法。
  2. 如果当前剩下大于一种奖品。将最小的那个奖品 \(x\) 和后面一个与它获得数量相同的 \(y\) 放一起,使得 \(x\) 数量加 \(1\)。之后让所有还有剩下的奖品都和 \(x\) 放一起一次,使得所有剩下的奖品数量增加 \(1\)

发现这样的话,我们其实只需要在意出现次数最大的那个奖品 \(x\)。如果有多个一定合法。

  1. \(cnt_x\)\(\max\limits_{y\ne x}^{} cnt_y + 1\) 大。一定不合法。
  2. \(x\) 后面没有次大值。一定不合法。

反之一定合法。

那么问题变成:求 \(cnt\) 的方案数,使得:

  1. \(\sum\limits_{i=1}^{n}cnt_i = k\)
  2. \(cnt_i \le m\)
  3. 如果只有 \(1\) 个最大值,最大值后面一定有一个等于它减 \(1\)

用总的减去不合法的。

  1. 最大值比次大值大至少 \(2\)。枚举最大值为 \(x\)。那么问题变成 \(n-1\) 个数,\(cnt_i \le x - 2\)。答案就是 \(n \sum\limits_{i=0}^{\min(n-1,\frac{k-x}{(x-1)})}(-1)^i\binom{n-1}{i}\binom{(k-x)-i(x-1)+(n-1)-1}{n-1-1}\)。这个是调和级数的,时间复杂度 \(O(n\log n)\)
  2. 最大值比次大值多 \(1\) 但最大值后面不存在次大值。强制钦定最后一个次大值是最大值,也就是给它额外加 \(1\)。那么总的方案数为 \(\sum\limits_{i=0}^{\min(n,\frac{k-1}{m})}(-1)^i\binom{n}{i}\binom{(k-1)-im+n-1}{n-1}\)。然后还需要减去只有一个次大值的情况,枚举次大值的值 \(x\)。方案数为 \(n\sum\limits_{i=0}^{\min(n-1,\frac{k-x-1}{x})}(-1)^i\binom{n-1}{i}\binom{(k-x-1)-ix+(n-1)-1}{n-1-1}\)

\(G(n,k,x) = \sum\limits_{i=0}^{\min(n,\frac{k}{x+1})}(-1)^i \binom{n}{i}\binom{k-i(x+1)+n-1}{n-1}\),那么答案就是:

\[G(n,k,m) - \sum\limits_{x=2}^{m}nG(n-1,k-x,x-2) - \\ (G(n,k-1,m-1) - \sum\limits_{x = 0}^{m-1}nG(n-1,k-x-1,x-1))\\ = G(n,k,m) - G(n,k-1,m-1) \]

时间复杂度 \(O(n)\)

P8340 [AHOI2022] 山河重整

求有多少个集合做 \(01\) 背包可以得到 \([1,n]\) 每个数。

显然每次加入一个数 \(i\) 后能得到的数应该是一个 \([1,n]\) 的前缀(从小到大加入 \(i\))。不妨设第一次由前缀分裂成区间时加入的数是 \(x\),前缀是 \([1,y]\)。那么分裂的区间变成 \([1,y]\cup [x,x + y]\)。而后由于能够加入的数都 \(>x\),所以 \([y + 1,x-1]\) 是一定得不到的,不可能合法。

考虑容斥。枚举第一个无法得到的数 \(x\)。因为我们知道一个前缀分裂成区间后就不可能恢复了,所以这个 \(x\) 一定是第一次分裂时产生的。也就是 \([1,x-1]\) 中选择的数恰好能得到 \([1,x-1]\),且后面选择了一个 \(>x\) 的数。那么 \([1,x-1]\) 中选择的数的和一定是 \(x-1\)

定义 \(f_i\) 表示 \([1,i]\) 中选数,和恰好是 \(i\) 且能得到 \([1,i]\) 中每个数的方案数。那么答案应该是 \(g_n =2^n -\sum\limits_{x=1}^{n}2^{n-x}f_{x-1}\)。对于 \(f\),依旧考虑容斥。枚举第一个不能得到的数 \(x\),那么 \(f_{n} = w_{1,n,n} - \sum\limits_{x=1}^{n}f_{x-1}w_{x+1,n,n-x+1}\)。其中 \(w_{l,r,x}\) 为在 \([l,r]\) 中选数,和恰好是 \(x\) 的方案数。

首先对于 \(w_{1,n,n}\) 是简单的。不妨设 \(dp_{i,j}\) 为选了 \(i\) 个数,和为 \(j\) 的方案数。那么:

\[dp_{i,j} \gets dp_{i,j-i}+dp_{i-1,j-i-1} \]

因为最多选 \(\sqrt{n}\) 个数,所以复杂度是 \(O(n\sqrt{n})\) 的。

对于后面一半,枚举选了 \(k\) 个数,那么它们的和至少是 \((x+1)k\)。则问题变成 \([1,n-x]\) 中选一些数,使得和为 \(n-x+1-(x+1)k\)。有 \(f_{n} = \sum dp_{i,n} -\sum\limits_{x=1}^{n}f_{x-1}\sum\limits_{k=1}^{n-x}dp_{k,n-x+1-(x+1)k}\)。考虑维护 \(h_{i,j}\) 表示现在还有 \(i\) 个数要增加,当前和为 \(j\) 的方案数。那么对于 \(x\) 来说,枚举它最后给某个 \(n\) 贡献了 \(k\) 个数,有 \(h_{k,x-1+(x+1)k}\gets f_{x-1}\)。然后对于 \(h\),有:

\[h_{i,j} \gets h_{i,j-i} + h_{i+1,j-i} \]

因为互不相同,所以每次最多弹一个数出去。

最后有 \(f_{n} = \sum dp_{i,n} - h_{0,n}\)。然后这玩意要半在线地做,而 \(f_{x-1}\) 不会对 \(n< 2x\) 的点产生贡献,所以每次折半就行了。具体地,先处理 \([1,\frac{n}{2}]\) 再处理 \([1,\frac{n}{2}]\)\([\frac{n}{2}+1,n]\) 的贡献。时间复杂度 \(T(n) = O(n\sqrt{n} )+ T(\frac{n}{2}) = O(n\sqrt{n})\)

posted @ 2026-03-26 22:00  harmis_yz  阅读(4)  评论(0)    收藏  举报