![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
多项式-FFT/NTT
文章平均质量分 65
多项式-FFT/NTT
飞猪不会飞123
ICPC区域赛银,2年算法竞赛辅导经历。北京师范大学计算机研究生
展开
-
BZOJ3509-FFT,分块
参考博客题目大意:给你一个序列,问你有多少个三元组(i,j,k)(i,j,k)(i,j,k)满足他们是一个等差数列。题目思路:枚举中间项,暴力fft.复杂度O(n2logn)O(n^2logn)O(n2logn).分块,块大小nlogn=2000\sqrt{nlogn}=2000nlogn=2000最优.对于块内暴力计算,块外fft.复杂度:O((nlogn)32)O((nlogn)^{\frac{3}{2}})O((nlogn)23)...原创 2021-03-27 10:19:26 · 180 阅读 · 0 评论 -
1218E - Product Tuples-NTT,分治思想
前言:参考博客,这里不是指分治NTT.题目大意:给你nnn个数,求任意选出k个数的乘积的累和.题目思路:这里有两个点比较妙:1.构造生成函数 2.快速求多项式乘法.1.考虑如何构造生成函数?显然,每个数选或不选,总共nnn个多项式相乘. xkx^kxk的系数一定是积的和.符合题目要求.那么有多项式:A(x)=(1+a1x)(1+a2x)...(1+anx)A(x)=(1+a_1x)(1+a_2x)...(1+a_nx)A(x)=(1+a1x)(1+a2x)...(1+anx).2.快原创 2021-03-26 10:59:00 · 150 阅读 · 0 评论 -
牛客Steins;Gate(原根+FFT)
题目大意:给一个长度为nnn的序列。对每一个aka_kak,询问有多少个二元组(i,j)(i,j)(i,j)满足ai∗aj(mod p)=aka_i*a_j(mod \ p)=a_kai∗aj(mod p)=ak.题目思路:这里用到了一个定理,所有素数一定存在原根。那么对于ppp的原根ggg来讲.任意一个x∈[0,p−1]x \in [0,p-1]x∈[0,p−1].都存在唯一一个iii使得gi=xg^i=xgi=x.所以上式可以换成:gi∗gj=gi+j=gkg^i*g^原创 2021-03-25 13:16:01 · 160 阅读 · 0 评论 -
任意模数多项式乘法(模板)
题目地址不想理解原理了,直接记板子。大概有三种做法。我选择记下NTT这种常数最大的。希望不会遇到卡常的吧.#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#include<cmath>#define LL long long#define maxn 400005using namespace std;const LL mod1=9982原创 2021-03-25 11:48:04 · 562 阅读 · 0 评论 -
CF632E-Thief in a Shop-生成函数,FFT,多项式快速幂
题目大意:nnn个数里面选择kkk个数出来,将他们累和。问有多少种数能被凑出来。(完全背包).n,k≤1000n,k \leq 1000n,k≤1000题目思路:母函数模板题。构造多项式A(x)A(x)A(x),第iii项的系数0/10/10/1代表是否有大小为iii的数.然后Ak(x)A^k(x)Ak(x)的系数即为答案.1.发现是一个幂次,可以用快速幂优化。但是注意点就是要额外维护变量代表当前两个多项式的项数最高次幂(也就是数组长度)。2.由于只求[是否能够凑出],不求方案数。那么再fft原创 2021-03-25 10:48:40 · 204 阅读 · 0 评论 -
FFT+简单生成函数+容斥原理两题
一.HDU4609题目大意:给你一个序列,任意选出三个不重复的数使得其能够组成三角形的概率.1≤n,ai≤1e51 \leq n,a_i \leq 1e51≤n,ai≤1e5题目思路:总方案数:Cn3C^3_nCn3假设三个数a≤b≤ca \leq b \leq ca≤b≤c,那么显然可以构造多项式自乘得出xkx^kxk的系数代表a+b=ka+b=ka+b=k的方案数。但是这个方案数有a=ba=ba=b,先减去这个部分。然后由于乘法有顺序,像ab,baab,baab,ba这种,所以方案除原创 2021-03-24 12:35:22 · 264 阅读 · 0 评论 -
CF993E-FFT,思维
题目大意:给你一个序列。对于每个kkk.问你有多少个区间满足里面小于xxx的个数恰好为kkk个.题目思路:自然想到先将<x< x<x的数标为111,其他为000.那么考虑问题转化为区间和恰好为kkk的区间个数。这个地方就很关键,很思维了。将上述问题转化为:前缀和+后缀和 = cnt−kcnt- kcnt−k的个数(cnt为1的总个数).这样以来,我们将前缀和归桶到多项式aia_iai的系数上,将后缀和归桶到多项式bib_ibi的系数上.两者作多项式乘法即可计算出ckc_kck原创 2021-03-24 00:05:18 · 140 阅读 · 0 评论 -
2016NA邀请赛-E - K-Inversions-FFT简单题
题目大意:给你一个只含A,BA,BA,B的字符串.问你有多少个间隔为kkk的字符对满足前一个是BBB.后一个是AAA.题目思路:发现又是这种只有两种的字符的.显然我们可以直接将字符串当成多项式乘起来.对于一个kkk,我们就是要求:∑i=0n−k−1[si==B&&si+k=A]\sum_{i=0}^{n-k-1}[s_i==B\&\&s_{i+k}=A]∑i=0n−k−1[si==B&&si+k=A]长得有点像卷积,我们对前者,将BBB置为1.原创 2021-03-22 15:29:55 · 128 阅读 · 0 评论 -
FFT/NTT解决字符匹配问题
参考博客前言:这题跟之前一道湖南对抗赛的题很像。都是FFT加速优化.这也是我第一道FFT的题目.FFT/NTT该算法有四个精髓点:1.将系数表示法转化为点值表示法。2.利用函数奇偶对称性+分治+引入复数域单位根实现快速求nnn个点值.3.利用矩阵的逆将点值表示法转化成系数表示法.4.根据逆矩阵的特征继续跑一遍FFT.(IFFT)NTT:在模意义下的快速变化.将单位根换成原根进行运算.其他一致.由于避免了浮点运算.速度快于FFT.题目大意:给你两个二进制字符串S,TS,TS,T.问你最少原创 2021-03-22 10:46:30 · 413 阅读 · 0 评论