BZOJ4555求和(cdq分治+NTT)

题意:

输出f(n)对998244353(7 × 17 × 223 + 1)取模的结果。1 ≤ n ≤ 100000

其中S(i,j)是第二类Stirling数,即有i个球,丢到j个盒子中,要求盒子不为空的方案总数

S(i,j)=S(i-1,j-1)+j*S(i-1,j) (前面一项表示第i个球单独放到一个盒子中,后面一项表示放到前面j个盒子中的某一个)

分析:

首先这个n不是丧心病狂的大,所以感觉可以求i=1时的结果,i=2时的结果,i=3时的结果……,于是可以不看第一个Σ

我们考虑后面的这项

这个表示有n个球,要丢到i个盒子中,这些盒子是有序的,并且球在盒子中有两种状态

换个方式枚举,枚举最后一个盒子中球的个数,那么有

右边这个有卷积的感觉了,再来弄一下,将组合公式带进去

令G(n)=g(n)/n!

那么有

这个inv(n-i)表示模意义下(n-i)!的逆元,这个预处理很简单

问题是这个并不是很简单的卷积,因为卷积是A(n)=ΣB(i)*C(n-i),但这里A=C

这里可以采取cdq分治的思想

我们要求G(l..r)

第一步:求G(l..mid)

第二步:求G(l..mid)对G(mid+1,r)的影响

第三步:求G(mid+1,r)

具体说下第二步

这时候G(l,mid)都已经确定了,它们对G(mid+1)的贡献是容易发现就是G(0,mid-l)和inv(0,r-l)的卷积

所以就是cdq分治过程中进行FFT

但因为这题数字很大,所以用FFT会出现精度上的问题

而且这题模数那么特殊,所以直接上NTT……

T(n)=T(n/2)+O(nlogn)

这个复杂度应该介于O(nlogn)和O(nlog^2n)之间吧……

时间: 2024-11-07 16:32:46

BZOJ4555求和(cdq分治+NTT)的相关文章

HDU5322 Hope(DP + CDQ分治 + NTT)

题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5322 Description Hope is a good thing, which can help you conquer obstacles in your life, just keep fighting, and solve the problem below. In mathematics, the notion of permutation relates to the ac

Tsinsen A1493 城市规划(DP + CDQ分治 + NTT)

题目 Source http://www.tsinsen.com/A1493 Description 刚刚解决完电力网络的问题, 阿狸又被领导的任务给难住了. 刚才说过, 阿狸的国家有n个城市, 现在国家需要在某些城市对之间建立一些贸易路线, 使得整个国家的任意两个城市都直接或间接的连通. 为了省钱, 每两个城市之间最多只能有一条直接的贸易路径. 对于两个建立路线的方案, 如果存在一个城市对, 在两个方案中是否建立路线不一样, 那么这两个方案就是不同的, 否则就是相同的. 现在你需要求出一共有多

[HEOI2016/TJOI2016][bzoj4555] 求和 [斯特林数+NTT]

题面 传送门 思路 首先,我们发现这个式子中大部分的项都和\(j\)有关(尤其是后面的\(2^j\ast j!\)),所以我们更换一下枚举方式,把这道题的枚举方式变成先\(j\)再\(i\) \(f(n)=\sum_{j=0}^n2^j\ast j!\sum_{i=0}^nS_i^j\) 第二类斯特林数有一个基于组合意义的公式: \(S_i^j=\frac1{j!}\sum_{k=0}^j(-1)^kC_j^k(j-k)^i=\sum_{k=0}^j\frac{(-1)^k(j-k)^i}{k!

[用CDQ分治解决区间加&区间求和]【习作】

[前言] 作为一个什么数据结构都不会只会CDQ分治和分块的蒟蒻,面对区间加&区间求和这么难的问题,怎么可能会写线段树呢 于是,用CDQ分治解决区间加&区间求和这篇习作应运而生 [Part.I]区间加&区间求和的数据结构做法 [一]线段树 裸题... 1141ms #include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #include

HDU5730 FFT+CDQ分治

题意:dp[n] = ∑ ( dp[n-i]*a[i] )+a[n], ( 1 <= i < n) cdq分治. 计算出dp[l ~ mid]后,dp[l ~ mid]与a[1 ~ r-l]做卷积运算. 1 #include <bits/stdc++.h> 2 using namespace std; 3 const int N = 4e5+5; 4 const int mod = 313; 5 const double pi = acos(-1.0); 6 struct comp

BZOJ 2683 简单题 cdq分治+树状数组

题意:链接 **方法:**cdq分治+树状数组 解析: 首先对于这道题,看了范围之后,二维的数据结构是显然不能过的,于是我们可能会考虑把一维排序之后另一位上数据结构什么的,然而cdq分治却能够很好的体现它的作用. 首先,对于每一个询问求和,显然是x在它左边的并且出现时间在它之前的所有的change对他可能会有影响. 我们按照x第一关键字,y第二关键字,操作第三关键字来排序所有的询问,然后在cdq的时候,每次递归处理左半区间,按照x动态的将y这一列的值加到树状数组里,来更新右半边的所有询问,注意这

COGS 577 蝗灾 cdq分治+树状数组

题目链接:点击打开链接 cdq入门资料:点击打开链接 思路:首先根据上面的ppt可知cdq分治: solve(l, mid); 计算[l,mid] 对 [mid+1, r] 区间的影响 solve(mid+1, r); 计算影响部分,把询问拆成2个,对x排序后搞搞即可. #include <stdio.h> #include <iostream> #include <algorithm> #include <sstream> #include <std

ZOJ 3874 Permutation Graph 分治NTT

Permutation Graph Time Limit: 2 Seconds      Memory Limit: 65536 KB Edward has a permutation {a1, a2, … an}. He finds that if he connects each pair (ai, aj) such that i < j and ai > aj, he will get a graph. For example, if the permutation is {2, 3,

ZOJ 3874 Permutation Graph (分治NTT优化DP)

题面:vjudge传送门 ZOJ传送门 题目大意:给你一个排列,如果两个数构成了逆序对,就在他们之间连一条无向边,这样很多数会构成一个联通块.现在给出联通块内点的编号,求所有可能的排列数 推来推去容易发现性质,同一联通块内的点一定是连续标号的,否则无解 然后我就不会了 好神的$NTT$优化$DP$啊 根据上面的性质,联通块之间是互不影响的,所以我们对每个联通块分别统计答案再相乘 定义$f[i]$表示$i$个点构成的合法联通块,可能的排列数 一个合法联通块的所有元素一定在同一联通块内,说明不可能存