BZOJ 2194 [快速傅里叶变换 卷积]
题意:请计算C[k]=sigma(a[i]*b[i-k]) 其中 k < = i < n ,并且有 n < = 10 ^ 5。 a,b中的元素均为小于等于100的非负整数。
卷积 (f x g)(n)=∑{f(i)*g(n-i):i=...n}
多项式乘法就是一个系数向量的卷积
可以用FFT快速计算卷积
遇到和不是定值的情况可以反转一个向量
如本题反转a向量后
c[k]=∑(a[n-i-]*b[i-k]) k<=i<=n-
更换求和指标 i=i-k
c[k]=∑(a[n-i-k-]*b[i]) <=i<=n-k-
把-k-1消去,令t=n-k-
c[n-t-]=∑(a[t-i]*b[i]) <=i<=t
这样就是标准的卷积形式啦
以前的推导
[update 2017-03-30]
重做了一下
反转一个向量,变成和为常数的形式
$ c_k = \sum\limits_{i=k}^{n-1} a_i b_{n-1-i+k} = d_{n+k-1} $
这样计算d是没问题的,因为a和b只有$0...n-1$非0,其他都是0
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
const int N=(<<)+, INF=1e9;
const double PI=acos(-);
inline int read(){
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
} struct meow{
double x, y;
meow(double a=, double b=):x(a), y(b){}
};
meow operator +(meow a, meow b) {return meow(a.x+b.x, a.y+b.y);}
meow operator -(meow a, meow b) {return meow(a.x-b.x, a.y-b.y);}
meow operator *(meow a, meow b) {return meow(a.x*b.x-a.y*b.y, a.x*b.y+a.y*b.x);}
meow conj(meow a) {return meow(a.x, -a.y);}
typedef meow cd; struct FFT{
int n, rev[N];
void ini(int lim) {
n=; int k=;
while(n<lim) n<<=, k++;
for(int i=; i<n; i++) {
int t=;
for(int j=; j<k; j++) if(i&(<<j)) t |= (<<(k--j));
rev[i]=t;
}
}
void dft(cd *a, int flag) {
for(int i=; i<n; i++) if(i<rev[i]) swap(a[i], a[rev[i]]);
for(int l=; l<=n; l<<=) {
int m=l>>;
cd wn = meow(cos(*PI/l), flag*sin(*PI/l));
for(cd *p=a; p!=a+n; p+=l) {
cd w(, );
for(int k=; k<m; k++) {
cd t = w*p[k+m];
p[k+m] = p[k] - t;
p[k] = p[k] + t;
w=w*wn;
}
}
}
if(flag==-) for(int i=; i<n; i++) a[i].x/=n;
}
void mul(cd *a, cd *b, int lim) {
ini(lim);
dft(a, ); dft(b, );
for(int i=; i<n; i++) a[i]=a[i]*b[i];
dft(a, -);
}
}f; int n;
cd a[N], b[N];
int main() {
freopen("in","r",stdin);
n=read();
for(int i=; i<n; i++) a[i].x=read(), b[n--i].x=read();
f.mul(a, b, n+n-);
for(int i=n-; i<*n-; i++) printf("%d\n", int(a[i].x+0.5));
}
BZOJ 2194 [快速傅里叶变换 卷积]的更多相关文章
- BZOJ 2194 快速傅立叶变换之二 | FFT
BZOJ 2194 快速傅立叶变换之二 题意 给出两个长为\(n\)的数组\(a\)和\(b\),\(c_k = \sum_{i = k}^{n - 1} a[i] * b[i - k]\). 题解 ...
- bzoj 2194: 快速傅立叶之二 -- FFT
2194: 快速傅立叶之二 Time Limit: 10 Sec Memory Limit: 259 MB Description 请计算C[k]=sigma(a[i]*b[i-k]) 其中 k & ...
- BZOJ.2194.快速傅立叶之二(FFT 卷积)
题目链接 \(Descripiton\) 给定\(A[\ ],B[\ ]\),求\[C[k]=\sum_{i=k}^{n-1}A[i]*B[i-k]\ (0\leq k<n)\] \(Solut ...
- bzoj 2194 快速傅立叶之二 —— FFT
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2194 如果把 a 序列翻转,则卷积得到的是 c[n-i],再把得到的 c 序列翻转即可. 代 ...
- BZOJ 2179 [快速傅里叶变换 高精度乘法]
2179: FFT快速傅立叶 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 3108 Solved: 1599[Submit][Status][Di ...
- [BZOJ]2194: 快速傅立叶之二
题目大意:给定序列a,b,求序列c满足c[k]=sigma(a[i]*b[i-k]) (k<=i<n).(n<=10^5) 思路:观察发现就是普通的卷积反一反(翻转ab其中一个后做卷 ...
- BZOJ 2194 快速傅立叶之二 ——FFT
[题目分析] 咦,这不是卷积裸题. 敲敲敲,结果样例也没过. 看看看,卧槽i和k怎么反了. 艹艹艹,把B数组取个反. 靠靠靠,怎么全是零. 算算算,最终的取值范围算错了. 交交交,总算是A掉了. [代 ...
- bzoj 2194: 快速傅立叶之二【NTT】
看别的blog好像我用了比较麻烦的方法-- (以下的n都--过 \[ c[i]=\sum_{j=i}^{n}a[i]*b[j-i] \] 设j=i+j \[ c[i]=\sum_{j=0}^{n-i} ...
- 【刷题】BZOJ 2194 快速傅立叶之二
Description 请计算C[k]=sigma(a[i]*b[i-k]) 其中 k < = i < n ,并且有 n < = 10 ^ 5. a,b中的元素均为小于等于100的非 ...
随机推荐
- 在echarts3中使用字符云
echarts2的官方API里是带有字符云的,但到了echarts3就被从官网上移除了,想要使用的话可以从github上下载: 下载地址:https://github.com/ecomfe/echar ...
- 【深度学习系列】CNN模型的可视化
前面几篇文章讲到了卷积神经网络CNN,但是对于它在每一层提取到的特征以及训练的过程可能还是不太明白,所以这节主要通过模型的可视化来神经网络在每一层中是如何训练的.我们知道,神经网络本身包含了一系列特征 ...
- windows 防火墙拦截nginx的问题
今天在azure vm上安装了nginx并配置了代理设置,但域名访问始终无法中转,一开始怀疑是nginx的服务没起来,但在本地访问localhost看下如下界面,证明服务是没问题的. 本地访问没问题, ...
- Yourphp系统发生错误
今天早用YP更新缓存,弹出如下错误: 随之而来的是错误信息是: [php] view plain copy [14-12-03 10:48:12] E:\wwwweb\xmwszt360\Core\L ...
- LNMP状态管理命令
https://lnmp.org/faq/lnmp-status-manager.html LNMP状态管理命令: LNMP 1.2+状态管理: lnmp {start|stop|reload|res ...
- OKMX6Q libx264交叉编译
最开始使用的是最新版x264-snapshot-20171119-2245 配置使用: ./configure --host=arm-linux --cross-prefix=arm-linux- - ...
- 设置某个类使用或者禁用ARC
设置这个类为ARC的 用:-fobjc-arc 设置这个类非ARC的:-fno-objc-arc 工程是非ARC的,但是引用的第三方类库是ARC的,所以要使用的时候,要单独设置这个第三方的类是A ...
- jquery自定义进度条与h5原生进度条
介绍一款自定义的进度条 <div class="box-nine"> <div class="progress"> <!--一 ...
- poweshell批量删除某类型文件
错误方法 rm *.o" -recurse 按照提示,rm(remove-item)是可以递归删除子文件夹的.但是这个方法确实无效.在他们的示例里面找到说明: --------------- ...
- AF_INET 和PF_INET区别;AF_LOCAL PF_LOCAL 区别.
从字面理解: AF_INET = Address Format, Internet = IP Addresses PF_INET = Packet Format, Internet = IP, TCP ...