ABC246F题解
Description:
有 \(N\) 个字符集,可以任选一个字符集,从中任意组出一个长度为 \(L\) 的字符串。问能得到多少种不同的字符串。
如两个字符集为 \(\tt{ab}\) 和 \(\tt{ac}\) 可以组成 \(\tt{aa},\tt{ab},\tt{ac},\tt{ba},\tt{ca},\tt{bb},\tt{cc}\) 共 \(7\) 个不同的字符串。
\(N\leq18,L\leq10^9\)
容斥。
如果只有两个字符串,则明显答案为:由第一个字符集组出的字符串数量+由第二个字符集组出的字符串数量-两个字符集都能组出的字符串数量。
用数学语言表示就是 \(|S_1|^L+|S_2|^L-|S_1\cap S_2|^L\)。
那么推广到 \(N\) 个字符集,也是类似的。答案就是 $$\sum_{S\in N} -1^{\operatorname{count}{S}}\times |S_1\cap S_2\cap\ldots|^L$$
其中 \(\operatorname{count}\{S\}\) 表示 \(S\) 中字符集的个数,\(|S_1\cap S_2\cap\ldots|\) 表示 \(S\) 中所有字符串的并集。
那这样这个题就做完了。用状态压缩去枚举子集。做交集的时候我只需要知道有几个字符,而不需要知道是哪些字符,所以我枚举每一个字母,看他是否存在于所有子集中包含的字符串即可。