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的非 ...
随机推荐
- ubantu下su命令Authentication failure失败的解决方式
Ubuntu安装后,root用户默认是被锁定了的,不允许登录,也不允许 su 到 root . 可以使用: sudo passwd 来重新设置root密码,后即可登陆root. ortonwu@ubu ...
- 浅谈event.client、event.screen与event.offset
每每看到event.client.event.screen与event.offset这几个,头都大了,今天又碰到了,特来总结下. 1.event.screenX与event.screenY. 首先,e ...
- HDU 2682 Tree
题目: There are N (2<=N<=600) cities,each has a value of happiness,we consider two cities A and ...
- JavaScript八张思维导图
JS基本概念 JS操作符 JS基本语句 JS数组用法 Date用法 JS字符串用法 JS编程风格 JS编程实践 不知不觉做前端已经五年多了,无论是从最初的jQuery还是现在火热的Angular,Vu ...
- 算法-java代码实现插入排序
插入排序
- TP5使用phpmailer实现邮件发送
1.从github下载PHPMailer,在vendor目录中新建文件夹phpmailer,将压缩包中的class.phpmailer.php和class.smtp.php复制到phpmailer中, ...
- iOS 注册页面 报错
1.SpringBoard 无法启动应用程序(错误:-3) 方法:重启模拟器 2.
- mybatis-databaseIdProvider多数据库支持
<select id="selectPerson" parameterType="int" parameterMap="deprecated&q ...
- common-logging源码解析
OK,现在我们来研究下common-logging的源码.这篇博客有参照上善若水的博客,感谢他的无私分享. 先来随便扯点吧,貌似所有这些流行的Logging框架都和Log4J多少有点关系(不太确定Co ...
- Android Studio 下获取debug sha1和md5
Open Android Studio Open Your Project Click on Gradle (From Right Side Panel, you will see Gradle Ba ...