FFT && NTT
morejarphone
这个作者很懒,什么都没留下…
展开
-
CodeChef Arithmetic Progressions (分块FFT)
题意:给出 A 1 ,A 2 ,...,A N 统计满足: ▶ i ▶ A i + A k = 2A j 的 (i,j,k) 数量。 (N ≤ 30000,A i ≤ 10 5 ) 分块,把长度为n的序列分成sqrt(n)块长度为sqrt(n)的序列,然后遍历每一个块分三种情况: 1)三个都在同一个块里面: 暴力枚举后两个,每次维护前面的数的个数,复杂度O(sqrt(n)*n)原创 2016-03-15 21:12:55 · 509 阅读 · 0 评论 -
UVA 12298 (FFT)
题意:给定一个区间[a,b],给定四种花色的纸牌,每张牌上都有一个合数.对于每一个n属于[a,b]四种牌中各取一张和等于n的方案数.然后限制条件是有几种牌遗失了. 裸的fft,找出所有的合数记录下来然后去掉遗失的,对每个花色FFT,然后四个花色的点表达式相乘求出IDFT就是方案数了~ 坑点:所有的都要换成long double!!! #include #include #include原创 2016-03-16 13:31:11 · 349 阅读 · 0 评论 -
HDU 5730 (CDQ分治 FFT)
题目链接:点击这里题意:给出i个连续格子的涂色方案, 求出涂n个格子的方案总数. FFT的经典运用,计算∑n−1i=1ai×bn−i\sum_{i=1}^{n-1}a_i\times b_{n-i}. 设dpidp_i表示涂i个格子的方案数, 显然dpn=∑ni=1an−i×dpidp_n=\sum_{i=1}^na_{n-i}\times dp_i. 然后就可以用CDQ分治, 在计算(l,r)原创 2016-07-25 15:09:21 · 806 阅读 · 0 评论 -
FFT,NTT学习笔记
快速傅里叶变换,可以将多项式相乘的时间复杂度从最简单的O(n^2)优化到O(nlgn),详细过程参考算法导论. FFT的流程大致是: 1):构造多项式,复杂度O(n) 2):求两个多项式的DFT,复杂度O(nlgn) 3):构造多项式乘积的点值表达式,复杂度O(n) 4):求点值表达式的IDFT,复杂度O(nlgn). 下面是两道最简单的习题: HDU 1402:点击打开链接原创 2016-03-15 19:28:12 · 1407 阅读 · 0 评论 -
HDU 5829 (NTT)
题目链接:点击这里题意:定义f(k)为集合S中∑所有子集前k大数的和\sum 所有子集前k大数的和,求所有的k(1≤k≤n1\leq k \leq n).从大到小排序,考虑第k个数的贡献fkf_k,那么有: fk=∑ni=kCk−1i−1∗Ai∗2n−i=12k∗(k−1)!∑n−ki=0(i+k−1)!i!∗2n−i∗Ai+kf_k=\sum_{i=k}^{n}C_{i-1}^{k-1}*A_{原创 2016-09-12 23:50:14 · 1169 阅读 · 0 评论 -
HDU 5552 (CDQ分治 NTT)
题意:n个点有环连通图计数。每条边可以染成m种颜色。定义一些数组: 1. f[n]: n个点的原创 2016-09-04 16:04:31 · 1325 阅读 · 0 评论 -
HDU 5896 (CDQ分治 NTT)
题目链接:点击这里题意:求n个点的有环图。作为出题人已经被全国acmer翔都喷出来了T.T 题面显示的版本是初始版本,大概时限需要开到10s左右,HDU的管理员表示服务器要受不了让我们改数据,于是把2e5->2e4,然后也就不需要至多一组大于1000这样的话了。结果中间过程出现了某种不可描述的错误导致题面还是古老版本的题面,于是出现了喜闻乐见的二分判数据,各种黑科技压时间的情况。表示抱歉~~~~相原创 2016-09-19 23:17:10 · 1257 阅读 · 3 评论 -
hihocoder 1388 (中国剩余定理 NTT)
题目链接:点击这里题意:求min{∑n−10(Ai−B(i+k) mod n)2∥∥k=0,1…n−1}min \left\{ \sum_{0}^{n-1}(A_i-B_{(i+k) \space mod \space n})^2 \big\|k=0,1\dots n-1 \right\}.把A数组逆置过来倍增一倍的长度,显然结果就是卷积的某一项。结果比较比,所以NTT时取两个10910^9左右的模原创 2016-10-11 19:00:08 · 866 阅读 · 0 评论 -
Asia Hong Kong Online Preliminary A (FFT)
题目链接:点击这里题意:给出n个数字(∈[−50000,50000]\in[-50000, 50000]),求有多少(i,j,k)满足ai+aj=aka_i+a_j=a_k(要求i,j,k互不相同)。0比较麻烦直接拎出来记录个数,其他的加一个50000避免负数直接存起来。然后开一个数组记录每一个数字出现多少次,这个数组和自己做一次卷积即可。答案分成几部分: 1. i+j=k: 直接遍历扔掉0的原创 2016-10-05 16:15:52 · 1103 阅读 · 0 评论