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的非 ...
随机推荐
- JXLS 2.4.0系列教程(一)——最简单的模板导出
Java中实现excel根据模板导出数据的方法有很多,一般简单的可以通过操作POI进行.还可以使用一些工具很轻松的实现模板导出.这些工具现在还在维护,而且做得比较好的国内的有easyPOI,国外的就是 ...
- java中JFrame类中函数addWindowListener(new WindowAdapter)
转自:http://blog.csdn.net/datouniao1/article/details/46984987:侵删. 在java编写的过程中常常遇到样的一段代码: frame.addWind ...
- webpack的安装与使用
在安装 Webpack 前,你本地环境必须已安装nodejs. 可以使用npm安装,当然由于 npm 安装速度慢,也可以使用淘宝的镜像及其命令 cnpm,安装使用介绍参照:使用淘宝 NPM 镜像. 使 ...
- 急!!ftp登录错误,提示 530 not logged in,连接失败 ,,是怎么回事啊
愤怒地青鸟 | 浏览 68533 次 发布于2017-04-11 00:44 最佳答案 核心提示:Ftp登陆不了是很经常碰到的事,很多人常常是不加分析就发贴询问.老实说,这样既浪费自己时间,又浪费别人 ...
- Linux中rpm命令用法听语音
rpm 是红帽(RedHat)软件包管理工具,实现类似于 Windows 中的添加/删除程序功能.下面,就来向大家介绍 rpm 命令的用法. 工具/原料 CentOS 一.rpm常用参数 1 rpm ...
- tp5 点击刷新验证码
<form action="<{:url('index/index/login')}>" method="post" name="f ...
- 【编程技巧】java不使用第三个变量处理两个变量的交换
public class SwapNum {public static void main(String[] args) {doSwapNum();}public static void doSwap ...
- beetl模板引擎使用笔记
maven项目pom: <dependency> <groupId>com.ibeetl</groupId> <artifactId>beetl< ...
- C# winform页面可视化设计打开失败,提示未能加载程序集或他的一个依赖项,dll错误
这种情况发生在最初项目是x86属性,改成x64后,一些原来dll,页面没有及时更新,导致页面找不到dll, 最简单的解决方式,把项目属性改成AnyCpu,重新编译下,就可以打开可视化设计窗口了.
- [one day one question] webpack打包压缩 ES6 js、.vue报错
问题描述: 报错: ERROR in js/test.js from UglifyJs Unexpected token punc ?(?, expected punc ?:? [js/test.js ...