pb 组合计数

AGC052C Nondivisible Prefix Sums

最吓人,感觉不是一般人能做的。

题意:

给定一个素数 \(P\),这是你讨厌的数字。

对于一个整数序列 \(A_1,\ A_2,\ \dots,\ A_N\),如果可以重新排列这些元素,使得任意前缀和都不能被 \(P\) 整除(即,重新排列后,对于所有 \(1 \le i \le N\),都不存在 \(A_1 + A_2 + \dots + A_i \equiv 0 \pmod{P}\)),那么称这个序列为序列。

长度为 \(N\) 的整数序列,每个元素都在 \(1\)\(P-1\) 之间(包含 \(1\)\(P-1\)),这样的序列一共有 \((P-1)^N\) 种。请问其中有多少个序列。

由于答案可能非常大,请输出其对 \(998244353\) 取模的结果。

sol

不重排的方案是非常好算的 \((P-1)(P-2)^{n-1}\) 即为答案,但是现在有重排会算重。

我们对于一个序列直接考虑一个很简单的构造,首先我们把它随机排序。

然后如果这时我们填 \(a_i\)\(sum=0\) 了,我们只需要在后面找到一个 \(a_j!=a_i\) 跟它互换就行了。

这个构造会在最后剩下的数全是一样的不合法,这启示我们一个数出现多了也是一种不合法的原因。

我们把数列中出现最多的数给提出来,因为对 \(P\) 取模,所以直接设它为 \(1\)

假设不为 \(1\) 的数填了 \(m\) 个,\(1\) 的数量就为 \(n-m\)

考虑如下构造:

先填 \(P-1\)\(1\),然后填 第一个不为 \(1\) 的数记作 \(b_1\),然后再填 \(P-b_1\)\(1\),然后是 \(b_2\),然后是 \(P-b_2\)\(1\)...

就像下面这个。

\(1,1,1,...b_1,1,1,1,...b_2...b_m,1,1,1,1\)

这个不合法的情况只是当填完最后 \(P-b_m\)\(1\) 后还剩 \(1\)

那么就需要满足 \(n-m \leq P-1 + \sum_{i=1}^m P-b_i\),这个其实是个充要条件

刚刚的是充分性,现在来证明必要性。

不满足的话既是:\(n-m > P-1 + \sum_{i=1}^m P-b_i\)

此时的总和是要 \(n-m+\sum_{i=1}^m b_i> (m+1)P - 1\) 的。

不能是 \(P\) 的倍数,所以他只能大于等于 \((m+1)P+1\),但是你每次有一个 \(P\) 必定要消耗一个 \(b_i\),你这有 \(m+1\)\(P\),肯定是不合法的了。

于是我们现在是要统计 \(n-m \leq P-1 + \sum_{i=1}^m P-b_i\) 的序列个数,但是右半边太大了统计不了。

左边是 \(O(n)\) 量级的,所以统计 \(n-m > P-1 + \sum_{i=1}^m P-b_i\) 不合法的就行了。

我们需要计算总和不为 \(P\) 的方案,这是一个非常简单的 \(dp\)

我们设选了 \(i\)\(b\),然后 \(\sum_{i=1}^m P-b_i\) 的总和为 \(j\) 的方案为 \(f_{i,j}\)

这个就是个普通的完全背包,只需要注意 \(b_i\) 不能是 \(1\) 就行了。

然后算不合法的数量:

\(\sum_{i=0}^n\sum_j[n-i-j>P-1][n-i-j+i*p \equiv 0 (\mod p) ]{n \choose i}f_{i,j}(P-1)\)

这个 \(j\) 我们已经说明了它是个 \(<n\) 的东西了,然后就做完了。

agc008f Black Radius

题意

Snuke 君有一棵 \(n\) 个节点的全白的树,其中有一些节点他喜欢,有一些节点他不喜欢。他会选择一个他喜欢的节点 \(x\),然后选择一个距离 \(d\),然后将所有与 \(x\) 距离不超过 \(d\) 的节点都染成黑色,恰好操作一次,问有多少种可能的染色后状态。

两个状态不同当且仅当存在一个节点,它在两个状态中不同色。

sol

发现这个连通块是非常不好考虑的,不如你去考虑这个连通块的中心点(这里指的是直径中心),设其为 \(x\)

记一个 \(S(x,d)\) 表示距离 \(x\) 不超过 \(d\) 的集合,\(mxdep_u\) 以 u 为根最大的深度。

注意到如果没有顶到底的话,既 \(d < mxdep_u\),一定有 \(S(x,d)!=S(y,d)\)

然后为了防止计数计重复,\(x\) 就只能选择中心点,考虑枚举这个中心点 (这里注意边也是可以的)。

分类讨论,如果 \(x\)\(u,v\) 连着的一条边,那么我们不妨设 \(dep_u \leq dep_v\)

要想把 \(x\) 这个边给设成中心点,那么肯定要让子树 \(u\) 填满,\(v\) 填不满,所以可以得出 \(u\) 中的好点都有 \(1\) 的贡献。

然后就是点的情况了,我们直接猜测对于一个 \(x\) 其合法的 \(d\) 是一段区间,然后就继续分讨。

如果我们的 \(x\) 是一个好点,那么 \(d\) 的下界肯定是 \(0\),上界就是以 \(x\) 为根的树的深度次大值。

不是好点的话,上界肯定是没变的,现在只需要求下界的变化。

你要想让 \(x\) 成为连通块的中点,肯定得是他的一个子树中的一个好点把自己给塞满了,并且把其他的子树也塞了个自己的子树的大小,所以式子就很简单了:

\(\min\{mxdep_v \}\)\(v\) 是一个好点。

现在只需要换根 dp 去做就好了。

AGC012F Prefix Median

题意

给你一个长度为 \(2n - 1\) 的数组 \(a\),记一个长度为 \(n\) 的数组 \(b\)\(b_i\)\(a_1,a_2,...a_{2i-1}\) 的中位数,求 \(b_i\) 排列的数量。

sol

加入两个数后,当前的 \(b_i\) 肯定只会变成在 \(a\) 序列上的一个前驱或者后继或者保持不变。

既是不会存在一个 \(j\) 使得 \(\min(b_i,b_i-1)<b_j<\max(b_i,b_i-1)\)

现在我们来探讨一下这个 \(b_i\) 的取值范围。

我们不妨设 \(a\) 数组是一个排列,这样更好讨论,那么 \(b_i\) 就要满足下面两点:

1.\(b_i \in [i,2*n-i]\)
2.\(\min(b_i,b_i-1)<b_j<\max(b_i,b_i-1)\)

考虑怎么去证明这个东西的充要性,我们先证明必要性。

\(n=1\) 显然是的。

\(n=2\) 时,\(b_n\) 不可能为 \(1\) 因为此时没有比 \(1\) 更小的数。

\(n=k\) 时,我们分类讨论:

\(b_{n-1}=n-1\) 时需要一个 \(>n-1\) 和一个 \(<n-1\) 的数,这显然是不可能的。

\(b_{n-1}=n\) 时需要两个 \(<n-1\) 的,这也显然是不可能的。

\(b_{n-1}=n+1\) 时,你如果填 \(n\) 和小于 \(n\) 的就会导致中位数为 \(n\),所以跟上面的情况一样了。

然后证明充分性,既是对于满足上面条件的排列就一定有合法构造:

这个特别好证明,你倒着做,如果 \(b_n>b_{n-1}\) 那么删掉两个比 \(b_{n-1}\) 大的就行

如果 \(b_n<b_{n-1}\) 那么删掉两个比 \(b_{n-1}\) 小的就行。

如果 \(b_n=b_{n-1}\) 那么删掉一个个比 \(b_{n-1}\) 大的一个比 \(b_{n-1}\) 小的就行

然后只要计数这样的 \(b_i\) 就行了。

\(f_{i,l,r}\) 表示考虑到 \(b_i\)\(l\) 个小于 \(b_i\)\(r\) 个大于 \(b_i\)

我们从后往前计数,因为尾部的中位数已经固定了好算:

\(f_{i,l,r} \to f_{i-1,l+1,r+1}\)
\(f_{i,l,r} \to f_{i-1,l',r+2} l'<l+1\)
\(f_{i,l,r} \to f_{i-1,l+2,r'} r'<r+1\)

posted @ 2025-08-21 16:15  degchuzm  阅读(6)  评论(0)    收藏  举报