题目描述 有一个\(n\)个元素的置换,你要选择\(k\)个元素,问有多少种方案满足:对于每个轮换,你都选择了其中的一个元素. 对\(998244353\)取模. \(k\leq n\leq 152501\) 题解 吐槽 为什么一道FFT题要把\(n\)设为\(150000\)? 解法一 先把轮换拆出来. 直接DP. 设\(f_{i,j}\)为前\(i\)个轮换选择了\(j\)个元素,且每个轮换都选择了至少一个元素的方案数. \[ f_{i,j}=\sum_{k=1}^{a_i}f_{i-1,j…
题目描述 在一个 \(n\) 个点的有向图中,编号从 \(1\) 到 \(n\),任意两个点之间都有且仅有一条有向边.现在已知一些单向的简单路径(路径上任意两点各不相同),例如 \(2\to 4\to 1\).且已知的这些简单路径之间没有公共的顶点,其 余的边的方向等概率随机. 你需要求出强连通分量(如果同时存在 \(a\) 到 \(b\), \(b\) 到 \(a\) 的有向路径,则 \(a\), \(b\) 属于同一个强联通分量) 的期望个数.如果最后答案是 \(\frac{A}{B}\),…
https://www.luogu.org/problemnew/solution/P4002 神树的题解写的很清楚了.稍微补充: 1.[x^i]ln(A(ax))=a^i[x^i]ln(A(x)),感觉直接证并非那么显然,大约是先求出多项式再把ax作为自变量带回去. 2.最后一句中的式子,即考虑由ai组成的|S|=k的S集合在xk中被统计了几次,容易发现仅当这个Σ∏(1-ajx) (i=1~n,j≠i)中的ai不在S中出现会被统计一次,于是统计次数为n-k,所以乘上n-k即为所要的系数. #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-…
hdu 5730 Shell Necklace 题意:求递推式\(f_n = \sum_{i=1}^n a_i f_{n-i}\),模313 多么优秀的模板题 可以用分治fft,也可以多项式求逆 分治fft 注意过程中把r-l+1当做次数界就可以了,因为其中一个向量是[l,mid],我们只需要[mid+1,r]的结果. 多项式求逆 变成了 \[ A(x) = \frac{f_0}{1-B(x)} \] 的形式 要用拆系数fft,直接把之前的代码复制上就可以啦 #include <iostream…
题目: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.org/problemnew/show/P4721 分治FFT:https://www.cnblogs.com/bztMinamoto/p/9749557.html https://blog.csdn.net/VictoryCzt/article/details/82939586 不知为何自己的总是很慢. 觉得是 n 和 m 表示次数的话,len<=n+m:n 和 m 表示项数的话,len<n+m:应该是这样? 这里是 mid-L+1 项和 R-L+1…
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3456 首先考虑DP做法,正难则反,考虑所有情况减去不连通的情况: 而不连通的情况就是那个经典做法:选定一个划分点,枚举包含它的连通块,连通块以外的部分随便连(但不和连通块连通),合起来就是不连通的方案数: 设 \( f[i] \) 表示一共 \( i \) 个点时的连通方案数,\( g[i] \) 表示 \( i \) 个点随便连的方案数,即 \( g[i] = 2^{C_{i}^{2}}…
题目:https://www.luogu.org/problemnew/show/P4721 分治做法,考虑左边对右边的贡献即可: 注意最大用到的 a 的项也不过是 a[r-l] ,所以 NTT 可以只做到 2*(r-l),能快一倍. 代码如下: #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; typedef long…
多项式 代码 const int nsz=(int)4e5+50; const ll nmod=998244353,g=3,ginv=332748118ll; //basic math ll qp(ll a,ll b){ ll res=1; for(;b;a=a*a%nmod,b>>=1)if(b&1)res=res*a%nmod; return res; } ll inv(ll n){ return qp(n,nmod-2); } //polynomial operations //…
4555: [Tjoi2016&Heoi2016]求和 题意:求\[ \sum_{i=0}^n \sum_{j=0}^i S(i,j)\cdot 2^j\cdot j! \\ S是第二类斯特林数 \] 首先你要把这个组合计数肝出来,于是我去翻了一波<组合数学> 用斯特林数容斥原理推导那个式子可以直接出卷积形式,见下一篇,本篇是分治fft做法 组合计数 斯特林数 \(S(n,i)\)表示将n个不同元素划分成i个相同集合非空的方案数 Bell数 \(B(n)=\sum\limits_{i=…
[HDU5730]Shell Necklace(多项式运算,分治FFT) 题面 Vjudge 翻译: 有一个长度为\(n\)的序列 已知给连续的长度为\(i\)的序列装饰的方案数为\(a[i]\) 求将\(n\)个位置全部装饰的总方案数. 答案\(mod\ 313\) 题解 很明显,是要求: \(f[n]=\sum_{i=0}^na[i]\times f[n-i],f[0]=0\) 卷积的形式啊.. 然后就可以开始搞了 忍不住的方法一 好明显啊,把生成函数\(F,A\)给搞出来 然后就有\(F*…
传送门 我是用多项式求逆做的因为分治FFT看不懂…… upd:分治FFT的看这里 话说这个万恶的生成函数到底是什么东西…… 我们令$F(x)=\sum_{i=0}^\infty f_ix^i,G(x)=\sum_{i=0}^\infty g_ix^i$,且$g_0=0$ 这俩玩意儿似乎就是$f(x)$和$g(x)$的生成函数 那么就有$$F(x)G(x)=\sum_{i=0}^\infty x^i\sum_{j+k=i}f_jg_k$$ 然后根据题目,有$$f_i=\sum_{j=1}^if_{…
一.多项式求逆 给定一个多项式 \(F(x)\),请求出一个多项式 \(G(x)\), 满足 \(F(x) * G(x) \equiv 1 ( \mathrm{mod\:} x^n )\).系数对 \(998244353\)取模. 考虑递归求解,当\(F\)的最高次为\(0\)时,\(G_0=F_0^{-1}\) 假设我们知道了\(F(x)\)在模\(x^{\left \lceil \frac{n}{2}\right \rceil}\)意义下的逆元\(G'\) 那么\(F∗G′≡1(\mathr…
题目大意 有\(n\)种颜色的球,第\(i\)种有\(a_i\)个.设\(m=\sum a_i\).你要把这\(m\)个小球排成一排.有\(q\)个询问,每次给你一个\(x\),问你有多少种方案使得相邻的小球同色的对数为\(x\). \(n\leq 10000,m\leq 200000\) 题解 我们考虑把这些小球分段,每段内所有小球颜色相同,但相邻两段的小球颜色可以相同. 设第\(i\)种颜色有\(b_i\)段,那么分\(j\)段的方案数是\(\frac{(\sum b_i)!}{\sum(b…
题目 令\(f_i\)表示n个点的答案.考虑容斥,用所有连边方案减去有多个连通块的方案.枚举1号点所在的连通块大小: \(f_i=2^{i(i-1)/2}-\sum_{j>0}^{i-1}f_j \binom{i-1}{j-1}2^{(i-j)(i-j-1)/2}\) \(\binom{i-1}{j-1}\)表示1号点必须在选出的连通块中,剩下的i-1个点中再选出j-1个.\(2^{(i-j)(i-j-1)/2}\)是剩下的点随意连边,但不跟选出的连通块连边的方案数. \[\begin{alig…
再探快速傅里叶变换(FFT)学习笔记(其三)(循环卷积的Bluestein算法+分治FFT+FFT的优化+任意模数NTT) 目录 再探快速傅里叶变换(FFT)学习笔记(其三)(循环卷积的Bluestein算法+分治FFT+FFT的优化+任意模数NTT) 写在前面 一些约定 循环卷积 DFT卷积的本质 Bluestein's Algorithm 例题 分治FFT 例题 FFT的弱常数优化 复杂算式中减少FFT次数 例题 利用循环卷积 小范围暴力 例题 快速幂乘法次数的优化 FFT的强常数优化 DF…
分治FFT是几个算法的统称.它们之间并无关联. 分治多项式乘法 问题如求\(\prod_{i=1}^na_ix+b\). 若挨个乘复杂度为\(O(n^2\log n)\),可分治做这件事,复杂度为\(O(n\log^2 n)\).采用这种算法的条件是最终乘出来的式子长度是\(O(n)\)的. 也可以用多项式ln和exp做到\(O(n\log n)\). 用CDQ分治快速求一类多项式的算法 第一类 已知\(f(x)=\sum_{i=1}^xf(i)g(x-i)\),给定\(f(0)\).\(g(1…
显然构造出生成函数,对体积v的物品,生成函数为1+xv+x2v+……=1/(1-xv).将所有生成函数乘起来得到的多项式即为答案,设为F(x),即F(x)=1/∏(1-xvi).但这个多项式的项数是Σvi级别的,无法直接分治FFT卷起来. 我们要降低多项式的次数,于是考虑取对数,化乘为加,得到lnF(x)=-Σln(1-xvi).只要对每个多项式求出ln加起来再exp回去即可. 考虑怎么对这个特殊形式的多项式求ln.对ln(1-xv)求导,得ln(1-xv)'=(1-xv)'/(1-xv)=-v…
4555: [Tjoi2016&Heoi2016]求和 题意:求\[ \sum_{i=0}^n \sum_{j=0}^i S(i,j)\cdot 2^j\cdot j! \\ S是第二类斯特林数 \] 首先你要把这个组合计数肝出来,于是我去翻了一波<组合数学> 分治fft做法见上一篇,本篇是容斥原理+fft做法 组合计数 斯特林数 \(S(n,i)\)表示将n个不同元素划分成i个相同集合非空的方案数 考虑集合不相同情况\(S'(n,i)=S(n,i)*i!\),我们用容斥原理推♂倒她…
CTT=清华集训 题目大意 有\(n\)个点,点权为\(a_i\),你要连接一条边,使该图变成一颗树. 对于一种连边方案\(T\),设第\(i\)个点的度数为\(d_i\),那么这棵树的价值为: \[ val(T)=(\prod_{i=1}^na_i^{d_i}d_i^m)(\sum_{i=1}^nd_i^m) \] 求所有生成树的价值和\(\bmod 998244353\) \(n\leq 30000,m\leq 30\) 题解 很容易想到prufer序列 先把式子化简: \[ \begin{…
以前学的分治fft f[i]=sigma(f[i-x]*g[x]),其中g[x]已知 那么我们可以用cdq分治来做(l,mid 对mid+1,t的影响) 而现在的$f[i]=sum(f(i-x)*f(x))$ 我们如果沿用刚才的方法 会发现有$f(t-h)$这一项 而$t-h>mid$是有可能的 所以我们要在后续处理这件事情 先将$f[l,mid]*f[l,mid]$乘起来 如果$t-h<h$ 还要算$f[1,t-h]*f[h,mid]$ 注意还要乘2 注意多次用fft 每次还原a,b数组 因…
\[ \begin{aligned} Ans(k) &= \sum \limits_{i = 1}^n \sum \limits_{j = 1}^m \sum \limits_{t = 0}^k \binom{k}{t} a_i^t b_j^{k - t} \\ &= \sum \limits_{t = 0}^k \binom{k}{t} (\sum \limits_{i = 1}^n a_i^t) (\sum \limits_{j = 1}^m b_i^{k - t}) \\ &…
题目描述 给你一棵 $n$ 个点的树,对这棵树进行随机点分治,每次随机一个点作为分治中心.定义消耗时间为每层分治的子树大小之和,求消耗时间的期望. 输入 第一行一个整数n,表示树的大小接下来n-1行每行两个数a,b,表示a和b之间有一条边注意点是从0开始标号的 输出 一行一个浮点数表示答案四舍五入到小数点后4位如果害怕精度跪建议用long double或者extended 样例输入 30 11 2 样例输出 5.6667 题解 期望+树的点分治+FFT 由于期望可加,因此所求等于 $\sum\l…
题目链接 换一下形式:\[f_i=\sum_{j=0}^{i-1}f_jg_{i-j}\] 然后就是分治FFT模板了\[f_{i,i\in[mid+1,r]}=\sum_{j=l}^{mid}f_jg_{i-j}+\sum_{j=mid+1}^rf_jg_{i-j}\] 复杂度\(O(n\log^2n)\). 分治思路见:https://www.cnblogs.com/SovietPower/p/9366763.html 多项式求逆做法先坑着. //693ms 4.91MB #include <…
目录 分治FFT 目的 算法 代码 分治FFT 目的 解决这样一类式子: \[f[n] = \sum_{i = 0}^{n - 1}f[i]g[n - i]\] 算法 看上去跟普通卷积式子挺像的,但是由于计算\(f\)的每一项时都在利用它前面的项来产生贡献,所以不能一次FFT搞完.用FFT爆算复杂度\(O(n^2logn)\),比直接枚举复杂度还高-- 考虑优化这个算法,如果我们要计算区间\([l, r]\)内的\(f\)值,如果可以快速算出区间\([l, mid]\)内的\(f\)值对区间\(…
P4721 [模板]分治 FFT 题目背景 也可用多项式求逆解决. 题目描述 给定长度为 \(n−1\) 的数组 \(g[1],g[2],\dots,g[n-1]\),求 \(f[0],f[1],\dots,f[n-1]\),其中\(f[i]=\sum_{j=1}^if[i-j]g[j]\) 边界为 \(f[0]=1\) .答案模 \(998244353\) . 输入输出格式 输入格式: 第一行一个正整数 \(n\) . 第二行共 \(n−1\) 个非负整数 \(g[1],g[2],\dots,…
一般的分治FFT是指: https://www.luogu.org/problemnew/show/P4721 考虑后面的f和前面的f有关系,但是贡献可以分着计算,逐一累计上去. 考虑cdq分治.算出前面的[1,mid]的f之后,可以直接一次NTT,把后面[mid+1,r]的f的一部分算出来,累加上去. 对于后面的部分,发现都是一个前缀没有计算上.继续分治下去即可. 画个图就是这样. 细节注意: 1.边界, 2.0~n-1 3.四倍N的数组 4.注意之后每次都是NTT一个前缀. #include…
传送门 多项式求逆的解法看这里 我们考虑用分治 假设现在已经求出了$[l,mid]$的答案,要计算他们对$[mid+1,r]$的答案的影响 那么对右边部分的点$f_x$的影响就是$f_x+=\sum_{i=l}^{mid}f[i]g[x-i]$ 发现右边那个东西可以用卷积快速计算 那么只要一边分治一边跑FFT统计贡献就行了 说是分治FFT实际上代码里写的是NTT…… 而且分治FFT跑得好慢多项式求逆的速度是它的10倍啊…… //minamoto #include<iostream> #incl…
题目 简述: 有一段长度为n的贝壳,将其划分为若干段,给出划分为每种长度的方案数,问有多少种划分方案 题解 设\(f[i]\)表示长度为\(i\)时的方案数 不难得dp方程: \[f[i] = \sum\limits_{j=0}^{i} a[j] * f[i - j]\] 考虑转移 直接转移是\(O(n^2)\)的 如何优化? 容易发现这个转移方程非常特别,是一个卷积的形式 考虑fft 分治fft 分治fft解决的就是这样一个转移方程的快速计算的问题 \[f[i] = \sum\limits_{…