描述


http://www.lydsy.com/JudgeOnline/problem.php?id=2194

给出序列\(a[0],a[1],...,a[n-1]\)和\(b[0],b[1],...,b[n-1]\).

\(c[k]=\sum_{i=k}^{n-1}a[i]b[i-k]\).

求序列\(c[]\).

分析


这题就是BZOJ_3527_[ZJOI2014]_力_(FFT+卷积)的后半段...

我们来重新分析一下.

首先我们要知道卷积的标准形式:

$$c[i]=\sum_{j=0}^ia[j]b[i-j]$$

很明显这道题并不是卷积的形式,因为卷积是和一定,二这道题却是差一定.

我们其实可以画画图(我脑洞大)...

然后可以发现差一定的时候就是你+1,我也+1,你-1,我也-1.

但是如果我们把其中一个序列倒过来,就变成了你+1,我-1,你-1,我+1,就变成和一定的了!这一点灰常重要!

然后上次我推的那个太不自然,我们这次好好分析一下.

1.把a倒置.

把a倒置之前原式为(我们这里令\(n=n-1\),序列就是\(0~n\),方便一些)

$$\sum_{j=k}^na[i]b[i-k]$$

我们设倒置之后的序列为\(a'[]\),则有

$$原式\Longleftrightarrow\sum_{i=k}^na'[n-i][b[i-k]$$

换元,得到:

$$\sum_{i=0}^{n-k}a'[n-(i+k)]b[(i+k)-k]$$

$$\sum_{i=0}^{n-k}a'[n-i-k]b[i]$$

也就是:

$$c[k]=\sum_{i=0}^{n-k}a'[n-i-k]b[i]$$

如果我们设\(A[k]=\sum_{i=1}^ka'[k-i]b[i]\),那么就有:

$$c[k]=A[n-k]$$

这样我们求个卷积,然后倒过来输出就好了.

2.把b倒置

在网上看到好几篇题解都说是倒置b,但是自己推了好长时间都没有推出来,最后发现其中有一点奥妙...

倒置之前原式:

$$\sum_{i=k}^na[i]b[i-k]$$

我们设倒置之后的序列为\(b'[]\),则有:

$$原式\Longleftrightarrow\sum_{i=k}^na[i]b'[n-i+k]$$

换元,得到:

$$\sum_{i=0}^{n-k}a[i+k]b'[n_(i+k)+k]$$

也就是

$$\sum_{i=0}^{n-k}a[i+k]b'[n-i]$$.

可以发现和是定值\(n+k\),但是循环上界却只有\(n-k\).

我们想要得到的应该是:

$$\sum_{i=0}^{n+k}a[i+k]b'[n-i]$$.

我们得到的式子少了一部分.但是观察可以发现,我们得到的式子的循环上界是\(n-k\),对应\(a[n]b'[k]\).

继续向上的\(a[i]\)都为\(0\),而且都后的\(b[i]\)会越界(\(b[负数]\)).

所以这个就可以表示一个卷积了.

$$c[k]=\sum_{i=0}^{n+k}a[n+k-i]b'[i]$$

这个式子是根据原式表示一个卷积二构造出来的等价的式子,只是看起来比较方便而已.

我们设\(B[i]=\sum_{i=0}^ka[i]b[k-i]\).

这样就可以得到

$$c[k]=B[n+k]$$

倒置b的版本:

 #include <bits/stdc++.h>
using namespace std; const int N=1e5+,maxn=N<<;
const double pi=acos(-1.0);
int n;
int rev[maxn];
int f[N],f_[N],g[N],ans[N];
struct cp{
double r,i;
cp(double r=,double i=):r(r),i(i){}
cp operator + (const cp &x) const { return cp(r+x.r,i+x.i); }
cp operator - (const cp &x) const { return cp(r-x.r,i-x.i); }
cp operator * (const cp &x) const { return cp(r*x.r-i*x.i,r*x.i+i*x.r);}
}a[maxn],b[maxn],A[maxn];
void brc(int &n){
memset(rev,-,sizeof rev);
int k=,l=;
while(k<n) k<<=, l++;
n=k;
for(int i=;i<n-;i++){
if(rev[i]!=-) continue;
int x=i,y=,m=l;
while(m--) y<<=, y|=(x&), x>>=;
rev[i]=y, rev[y]=i;
}
}
void dft(cp *a,int n,int op){
for(int i=;i<n-;i++) A[rev[i]]=a[i];
for(int i=;i<n-;i++) a[i]=A[i];
for(int m=;m<=n;m<<=){
cp wn(cos(2.0*pi/m*op),sin(2.0*pi/m*op));
for(int i=;i<n;i+=m){
cp w(); int k=m>>;
for(int j=;j<k;j++){
cp u=a[i+j],t=w*a[i+j+k];
a[i+j]=u+t;
a[i+j+k]=u-t;
w=w*wn;
}
}
}
if(op==-)for(int i=;i<n;i++) a[i].r/=n;
}
void fft(int *x,int *y,int *ans,int la,int lb){
int len=la+lb-;
brc(len);
for(int i=;i<n;i++) a[i]=cp(x[i]), b[i]=cp(y[i]);
dft(a,len,); dft(b,len,);
for(int i=;i<len;i++) a[i]=a[i]*b[i];
dft(a,len,-);
for(int i=;i<len;i++) ans[i]=a[i].r+0.5;
}
int main(){
scanf("%d",&n);
for(int i=;i<n;i++) scanf("%d%d",&f[i],&g[i]);
for(int i=;i<n;i++) f_[i]=g[n--i];
fft(f,f_,ans,n,n);
for(int i=n-;i<n+n-;i++) printf("%d\n",ans[i]);
return ;
}

BZOJ_2194_快速傅立叶之二_(FFT+卷积)的更多相关文章

  1. 【BZOJ 2194】2194: 快速傅立叶之二(FFT)

    2194: 快速傅立叶之二 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 1273  Solved: 745 Description 请计算C[k]= ...

  2. BZOJ2194 快速傅立叶之二 【fft】

    题目 请计算C[k]=sigma(a[i]*b[i-k]) 其中 k < = i < n ,并且有 n < = 10 ^ 5. a,b中的元素均为小于等于100的非负整数. 输入格式 ...

  3. 2018.11.18 bzoj2194: 快速傅立叶之二(fft)

    传送门 模板题. 将bbb序列反过来然后上fftfftfft搞定. 代码: #include<bits/stdc++.h> #define ri register int using na ...

  4. bzoj 2194: 快速傅立叶之二 -- FFT

    2194: 快速傅立叶之二 Time Limit: 10 Sec  Memory Limit: 259 MB Description 请计算C[k]=sigma(a[i]*b[i-k]) 其中 k & ...

  5. 【BZOJ2194】快速傅立叶之二

    [BZOJ2194]快速傅立叶之二 Description 请计算C[k]=sigma(a[i]*b[i-k]) 其中 k < = i < n ,并且有 n < = 10 ^ 5. ...

  6. [bzoj2194]快速傅立叶之二_FFT

    快速傅立叶之二 bzoj-2194 题目大意:给定两个长度为$n$的序列$a$和$b$.求$c$序列,其中:$c_i=\sum\limits_{j=i}^{n-1} a_j\times b_{j-i} ...

  7. bzoj2194 快速傅立叶之二 ntt

    bzoj2194 快速傅立叶之二 链接 bzoj 思路 对我这种和式不强的人,直接转二维看. 发现对\(C_k\)贡献的数对(i,j),都是右斜对角线. 既然贡献是对角线,我们可以利用对角线的性质了. ...

  8. BZOJ.2194.快速傅立叶之二(FFT 卷积)

    题目链接 \(Descripiton\) 给定\(A[\ ],B[\ ]\),求\[C[k]=\sum_{i=k}^{n-1}A[i]*B[i-k]\ (0\leq k<n)\] \(Solut ...

  9. 【bzoj2194】快速傅立叶之二 FFT

    题意:给定序列a,b,求序列c,\(c(k)=\sum_{i=k}^{n-1}a(i)b(i-k)\) Solution: \[ c(k)=\sum_{i=k}^{n-1}a(i)b(i-k)\\ c ...

随机推荐

  1. activemq spring 配置

    Apache ActiveMQ是最流行和最强大的开源消息集成模式服务器.Apache ActiveMQ是速度快,支持多跨语言的客户端和协议,带有易于使用企业集成模式和许多先进的功能在充分支持JMS 1 ...

  2. 配置php的CAS客户端

    1.下载安装xmapp 2.开启Apache服务. 3.下载php的CAS客户端源码包(我使用的是CAS-1.2.0.tgz),解压到xmap的htdocs目录下(D:\xmapp\htdocs),进 ...

  3. 模板方法模式(Template Pattern)

    模板方法模式:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以在不改变算法的结构下,重新定义算法中的某些步骤. 这个模式是用来创建一个算法模板.模板就是一个方法.更具体地 ...

  4. 转载:【高并发简单解决方案 | 靠谱崔小拽 】redis队列缓存 + mysql 批量入库 + php离线整合

    需求背景:有个调用统计日志存储和统计需求,要求存储到mysql中:存储数据高峰能达到日均千万,瓶颈在于直接入库并发太高,可能会把mysql干垮. 问题分析 思考:应用网站架构的衍化过程中,应用最新的框 ...

  5. CentOS7 IP自动获取

    /etc/sysconfig/network-scripts HWADDR=00:15:5D:00:76:04TYPE=EthernetBOOTPROTO=dhcpDEFROUTE=yesPEERDN ...

  6. 51nod贪心算法入门-----任务分配问题

    任务执行顺序 有N个任务需要执行,第i个任务计算时占R[i]个空间,而后会释放一部分,最后储存计算结果需要占据O[i]个空间(O[i] < R[i]). 分析: 可以抽象成,从一个整数开始,每次 ...

  7. 整理grep实战文本搜索过滤技巧

    一:grep的简介: 文本搜索工具,根据用户指定的文本模式对目标文件进行逐行搜索,显示能够被模式所匹配到的行.配合正则表达式的使用可以实现强大的文本处理.下面一一说明正则的例子. 二:文本处理工具分类 ...

  8. poj 2175 Evacuation Plan 最小费用流判定,消圈算法

    题目链接 题意:一个城市有n座行政楼和m座避难所,现发生核战,要求将避难所中的人员全部安置到避难所中,每个人转移的费用为两座楼之间的曼哈顿距离+1,题目给了一种方案,问是否为最优方案,即是否全部的人员 ...

  9. Logback 简单使用

    1.Logback为取代log4j而生 Logback是由log4j创始人Ceki Gülcü设计的又一个开源日志组件.logback当前分成三个模块:logback-core,logback- cl ...

  10. C语言小知识

    1.数组初始化 a[5] = {1};     //1,0,0,0,0 a[5] = {0}; //0,0,0,0,0 a[3][3] = {1}; //1,0,0;0,0,0;0,0,0 a[3][ ...