交流-题解(容斥原理+组合数)

    科技2023-11-02  88

    交流-题解(容斥原理+组合数)

    原题

    在此。

    题目大意

    给你 n n n个字符串,其中选择 k k k个,如果合法则将’?’变成字符( 26 26 26个都可以,前提是合法)构成一个只含小写字母的字符串,求可以变成多少种字符串。 合法要求:一个位置上要不只有一种小写字母,要不是’?’。 解法:可以用状压 d p dp dp或者容斥原理+组合数完成。

    具体内容

    首先铺垫三个内容:交集、并集、集合大小。

    交集 用符号 ∩ \cap 表示,表示几个集合中都有的元素。并集 用符号 ∪ \cup 表示,表示几个集合中所有的元素(不算重复的)。集合大小 集合大小表示一个集合的元素个数。比如集合 A A A的元素个数表示为 C a r d ( A ) Card(A) Card(A) ∣ A ∣ |A| A

    然后如果要求多个集合(分别为 a 1 , a 2 , ⋯   , a n a_1,a_2,\cdots,a_n a1,a2,,an)的并集,有公式 ∣ a 1 ∪ a 2 ∪ ⋯ ∪ a n ∣ = ∑ 1 ≤ i ≤ n ∣ a i ∣ − ∑ 1 ≤ i < j ≤ n ∣ a i ∩ a j ∣ + ∑ 1 ≤ i < j < k ≤ n ∣ a i ∩ a j ∩ a k ∣ − … + ( − 1 ) n + 1 ∣ a 1 ∩ a 2 ∩ ⋯ ∩ a n ∣ \begin{aligned}\left|a_1\cup a_2\cup\cdots\cup a_n\right|=\sum_{1\le i\le n}\left|a_i\right|-\sum_{1\le i<j\le n}\left|a_i\cap a_j\right|+\sum_{1\le i<j<k\le n}\left|a_i\cap a_j\cap a_k\right|-\ldots+\left(-1\right)^{n+1}|a_1\cap a_2\cap \cdots \cap a_n|\end{aligned} a1a2an=1inai1i<jnaiaj+1i<j<knaiajak+(1)n+1a1a2an 合并方案: 4. ‘?’与小写字母合并为小写字母 5. ‘?’与’?’合并成’?’ 6. 两个不同的小写字母合并无效, r e t u r n return return

    对于每一个 k ≤ i ≤ n k\le i\le n kin,然后合并我们可以求出 a n s i ans_i ansi表示 26 26 26的(当 k = i k=i k=i时合并这几个串)问号数量次幂之和。 然后我们就可以进行容斥。 可以发现,设答案为 a n s w e r answer answer, 则 a n s w e r = ∑ i = k n a n s i × ( − 1   o r   1 ) × C i k \begin{aligned}answer=\sum_{i=k}^{n}{ans_i\times\left(-1\ or\ 1\right)\times C_i^k}\end{aligned} answer=i=knansi×(1 or 1)×Cik − 1 -1 1 1 1 1就是上面公式 + + + − - ,是奇负偶正。 具体为什么这么写,是因为我们构造了 n − k + 1 n-k+1 nk+1个交集。然后每个并集分别为 C i k a n s i C_i^kans_i Cikansi。原来的再乘以与 k k k可能重复的数量 C i k C_i^k Cik。 具体实现时应该加上模数再模,以免负数情况。

    Processed: 0.026, SQL: 8