随笔分类 -  算法-FFT

摘要:初步转化:不管死了多少个猎人,我们开枪时仍然在 n 个猎人里进行选择,如果选到了已经死去的猎人,就假装无事发生,再选一次,直到某次选中了活着的猎人为止。之后使用容斥,考虑哪些人死的时间晚于 1,写出式子后,发现可以用分治 NTT 计算。 阅读全文
posted @ 2021-03-06 21:48 duyiblue 阅读(195) 评论(0) 推荐(0) 编辑
摘要:最少的操作次数显然是 n - 置换环的数量。操作对每个置换环是独立的,将它们的操作序列用组合数插到一起即可。考虑求一个环的方案数。设 dp[i] 表示长度为 i 的环的方案数。朴素 DP 是 n^2 的,可以用分治 FFT 优化。 阅读全文
posted @ 2020-11-25 23:01 duyiblue 阅读(458) 评论(0) 推荐(0) 编辑
摘要:可以将 a 序列排序。枚举 p,q 上每个位置 i 对答案的贡献。枚举 p,q 上第 i 位的元素分别为 aj, ak。根据 j,k 的大小关系分类讨论一下,用组合数算出方案数,时间复杂度 O(n^3)。单独枚举 j 和 k,分别计算贡献(正的或负的,需要分类讨论一下),即可做到 O(n^2)。然后拿着 O(n^2) 的式子,把它化成卷积的形式,就能得到 O(n log n) 做法,可以通过本题。 阅读全文
posted @ 2020-11-01 22:40 duyiblue 阅读(359) 评论(1) 推荐(1) 编辑
摘要:拆方差。拆成三个部分,前两个部分是类似的。我们改变枚举方式,用桶存储出现次数,并做 NTT,就能求出。第三部分,基于前面 NTT 的结果,进行容斥。分类讨论一下,即可求出。 阅读全文
posted @ 2020-10-25 18:37 duyiblue 阅读(193) 评论(0) 推荐(1) 编辑
摘要:把覆盖,转化成插入,由此可以得到一个O(n^2)的DP。观察DP转移,发现答案是一堆短多项式的乘积。一般做法是分治FFT,不过本题里可以用倍增+二项式定理去掉一个log。 阅读全文
posted @ 2020-09-02 20:24 duyiblue 阅读(544) 评论(1) 推荐(0) 编辑
摘要:把序列变成一棵基环树。转化为求所有基环树环的数量之和。可以egf做。设g(n)表示n个节点的基环树森林数量,显然g(n)=n^n。设G(x)是g的egf。则n个节点的一棵基环树的数量就是F=ln G。环的总数,就等于F*G,相当于枚举某一棵基环树对答案的贡献,其他部分任意。时间复杂度n log n。k=2时,还要加上叶子数的期望,单独考虑每个节点的贡献即可。 阅读全文
posted @ 2020-08-04 22:10 duyiblue 阅读(340) 评论(2) 推荐(0) 编辑
该文被密码保护。
posted @ 2020-06-14 23:13 duyiblue 阅读(3) 评论(0) 推荐(0) 编辑
摘要:条件相当于求不能走原图里的边的方案数。把它容斥成,求必须走至少i条原图里边的方案数。先做状压DP,求出把原图,划分为x条链的方案数。链之间是完全图,完全图的哈密尔顿路径数量是x!,要乘上容斥系数,取决于不合法的边数。因为有n个图,相当于做n次背包,也就是自己卷自己的卷积。我们转成点值,然后快速幂,最后IDFT回去即可。 阅读全文
posted @ 2020-06-03 22:20 duyiblue 阅读(166) 评论(0) 推荐(1) 编辑
摘要:集合内两两距离小于等于x,等价于集合里深度最大的点,到所有其他点距离均小于等于x。把所有点按深度排序。依次枚举一个点作为深度最大的点,然后将它标记。我们每次要求所有已标记的点中到当前点距离小于等于x的点的数量。可以用点分树+树状数组统计。统计出这个后,做一遍FFT求出答案 阅读全文
posted @ 2020-06-01 18:17 duyiblue 阅读(351) 评论(0) 推荐(0) 编辑