FFT #include<iostream> #include<cstring> #include<cstdlib> #include<cstdio> #include<cmath> #include<algorithm> #define maxn 1000005 using namespace std; inline int read() { ,f=;char ch=getchar(); ; +ch-'; return x*f; }…
定义多项式$h(x)$的每一项系数$h_i$,为i在c[1]~c[n]中的出现次数. 定义多项式$f(x)$的每一项系数$f_i$,为权值为i的方案数. 通过简单的分析我们可以发现:$f(x)=\frac{2}{\sqrt{1-4h(x)}+1}$ 于是我们需要多项式开方和多项式求逆. 多项式求逆: 求$B(x)$,使得$A(x)*B(x)=1\;(mod\;x^m)$ 考虑倍增. 假设我们已知$A(x)*B(x)=1\;(mod\;x^m)$,要求$C(x)$,使得$A(x)*C(x)=1\;…
传送门 codeforces传送门codeforces传送门codeforces传送门 生成函数好题. 卡场差评至今未过 题意简述:nnn个点的二叉树,每个点的权值KaTeX parse error: Expected 'EOF', got '\inC' at position 4: v_i\̲i̲n̲C̲=\{a_1,a_2,...a-,定义一棵树的权值为所有点的权值之和,问有多少棵树满足其权值等于i(i=1,2,...,m)i(i=1,2,...,m)i(i=1,2,...,m) 对每个点的…
题面 传送门 思路 首先,我们把这个输入的点的生成函数搞出来: $C=\sum_{i=0}^{lim}s_ix^i$ 其中$lim$为集合里面出现过的最大的数,$s_i$表示大小为$i$的数是否出现过 我们再设另外一个函数$F$,定义$F_k$表示总权值为$k$的二叉树个数 那么,一个二叉树显然可以通过两个子树(可以权值为0,也就是空子树)和一个节点构成 那么有如下求$F$的式子 $F_0=1$ $F_k=\sum_{i=0}^k s_i \sum_{j=0}^{k-i} F_j F_{k-i-…
首先,我们构造一个函数$G(x)$,若存在$k∈C$,则$[x^k]G(x)=1$. 不妨设$F(x)$为最终答案的生成函数,则$[x^n]F(x)$即为权值为$n$的神犇二叉树个数. 不难推导出,$[x^n]F(x)=\sum_{i=0}^{n}[x^i]G(x)\sum_{j=0}^{n-i}[x^j]F(j)\times [x^{n-j-i}]F(n-j-i)$. (这个式子的意思就是说,不妨设当前根节点的权值为i,然后枚举左右两个子树的权值) 这个式子显然可以通过动规的方式去推,从而得出…
题解 分治FFT 设\(f_i\)为\(i\)个点组成的无向图个数,\(g_i\)为\(i\)个点组成的无向连通图个数 经过简单的推导(枚举\(1\)所在的连通块大小),有: \[ f_i=2^{\frac{i(i-1)}{2}} \] \[ \begin{align} g_i&=f_i-\sum_{j=1}^{i-1}\binom{n-1}{j-1}g_jf_{i-j}\\ &=f_i-(i-1)!\sum_{j=1}^{i-1}\frac{g_j}{(j-1)!}\frac{f_{i-…
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3456 分治FFT: 设 dp[ i ] 表示 i 个点时连通的方案数. 考虑算补集:连通的方案数 == 随便连方案数 - 不连通方案数 不连通方案数就和很久之前做过的“地震后的幻想乡”一样,枚举一个连通的点集,其中需要一直包含一个“划分点”保证不重复:其余部分随便连.注意还有从 i 个点里选 j 个点作为连通点集的那个组合数. \( dp[i]=2^{C^{2}_{i}} - \sum\l…
正题 题目链接:https://www.luogu.com.cn/problem/P6295 题目大意 求所有\(n\)个点的弱联通\(DAG\)数量. \(1\leq n\leq 10^5\) 解题思路 先不考虑弱联通的限制,求\(n\)个点的\(DAG\)数量. 设为\(f_i\),那么有式子 \[f_n=\sum_{i=1}^{n}\binom{n}{i}2^{i(n-i)}f_{n-i}(-1)^{i+1} \] 这个式子的意思是说新建一层出度为\(0\)的点,\(\binom{n}{i…
生成函数又有奇妙的性质. $F(x)=C(x)*F(x)*F(x)+1$ 然后大力解方程,得到一个带根号的式子. 多项式开根有解只与常数项有关. 发现两个解只有一个是成立的. 然后多项式开根.求逆. 不太会算复杂度为什么是$n\log {n}$的. 开根号里套了一个求逆,不应该是两个$\log$? #include <map> #include <cmath> #include <queue> #include <cstdio> #include <c…
Code: #include<bits/stdc++.h> #define maxn 300000 #define ll long long #define MOD 998244353 #define setIO(s) freopen(s".in","r",stdin) ,freopen(s".out","w",stdout) using namespace std; namespace poly{ #define…