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

题意:求$c[k]=\sum_{k<=i<n} a[i]b[i-k], n<=10^5$

#include <bits/stdc++.h>
using namespace std;
struct cp {
double x, y;
cp(double _x=0, double _y=0):x(_x),y(_y) {}
cp operator+(const cp &a) { return cp(x+a.x, y+a.y); }
cp operator-(const cp &a) { return cp(x-a.x, y-a.y); }
cp operator*(const cp &a) { return cp(x*a.x-y*a.y, x*a.y+y*a.x); }
};
const int N=400005;
const double pi=acos(-1);
int rev[N];
void dft(cp *a, int n, int flag) {
static cp A[N], u, v;
static int i, j, m, mid;
for(i=0; i<n; ++i) A[rev[i]]=a[i];
for(i=0; i<n; ++i) a[i]=A[i];
for(m=2; m<=n; m<<=1) {
cp wn(cos(pi*2/m), sin(pi*2/m)*flag);
for(i=0; i<n; i+=m) {
mid=m>>1; cp w(1);
for(j=0; j<mid; ++j) {
u=a[i+j], v=a[i+j+mid]*w;
a[i+j]=u+v;
a[i+j+mid]=u-v;
w=w*wn;
}
}
}
if(flag==-1) for(i=0; i<n; ++i) a[i].x/=n;
}
inline void init(int &len) {
static int k, t, j, r; k=1; t=0;
while(k<len) k<<=1, ++t;
len=k;
for(int i=0; i<len; ++i) {
k=i; j=t; r=0;
while(j--) r<<=1, r|=k&1, k>>=1;
rev[i]=r;
}
}
void fft(int *a, int *b, int *c, int la, int lb) {
static cp x[N], y[N];
int len=la+lb-1;
init(len);
for(int i=0; i<len; ++i) x[i].x=a[i], x[i].y=0;
for(int i=0; i<len; ++i) y[i].x=b[i], y[i].y=0;
dft(x, len, 1); dft(y, len, 1);
for(int i=0; i<len; ++i) x[i]=x[i]*y[i];
dft(x, len, -1);
for(int i=0; i<len; ++i) c[i]=x[i].x+0.5;
}
int x[N], y[N], a[N], n;
int main() {
scanf("%d", &n);
for(int i=0; i<n; ++i) scanf("%d%d", &x[i], &y[i]);
for(int i=0; i<n; ++i) a[i]=x[n-1-i];
fft(y, a, x, n, n);
for(int i=0; i<n; ++i) a[i]=x[n-1-i];
for(int i=0; i<n; ++i) printf("%d\n", a[i]);
return 0;
}

  


复习了下fft...能码出来真是极好的= =可是为什么我的fft辣么慢!

首先是很复杂的代换= =

$$
\begin{align}
c[k]
= & \sum_{k<=i<n} a[i]b[i-k] \\
= & \sum_{0<=i-k<=n-k-1} a[i]b[i-k] \\
\end{align}
$$

令$j=i-k, 则i=j+k$

$$ c[k] =  \sum_{0<=j<=n-k-1} a[j+k]b[j] $$

设 $ c'[n-k-1]=c[k] , T=n-k-1 \Rightarrow k=n-1-T $,有

$$ c'[T] = \sum_{0<=j<=T} a[n-1-(T-j)]b[j] $$

最后再设 $ a'[T-j]=a[n-1-(T-j)] \Rightarrow a'[x]=a[n-1-x] $

然后就是裸的卷积辣= =

【BZOJ】2194: 快速傅立叶之二的更多相关文章

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

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

  2. bzoj 2194 快速傅立叶之二 —— FFT

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2194 如果把 a 序列翻转,则卷积得到的是 c[n-i],再把得到的 c 序列翻转即可. 代 ...

  3. [BZOJ]2194: 快速傅立叶之二

    题目大意:给定序列a,b,求序列c满足c[k]=sigma(a[i]*b[i-k]) (k<=i<n).(n<=10^5) 思路:观察发现就是普通的卷积反一反(翻转ab其中一个后做卷 ...

  4. 【刷题】BZOJ 2194 快速傅立叶之二

    Description 请计算C[k]=sigma(a[i]*b[i-k]) 其中 k < = i < n ,并且有 n < = 10 ^ 5. a,b中的元素均为小于等于100的非 ...

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

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

  6. BZOJ 2194 快速傅立叶之二 ——FFT

    [题目分析] 咦,这不是卷积裸题. 敲敲敲,结果样例也没过. 看看看,卧槽i和k怎么反了. 艹艹艹,把B数组取个反. 靠靠靠,怎么全是零. 算算算,最终的取值范围算错了. 交交交,总算是A掉了. [代 ...

  7. 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} ...

  8. BZOJ 2194 快速傅立叶变换之二 | FFT

    BZOJ 2194 快速傅立叶变换之二 题意 给出两个长为\(n\)的数组\(a\)和\(b\),\(c_k = \sum_{i = k}^{n - 1} a[i] * b[i - k]\). 题解 ...

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

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

随机推荐

  1. WCF分布式开发必备知识(1):MSMQ消息队列

    本章我们来了解下MSMQ的基本概念和开发过程.MSMQ全称MicroSoft Message Queue,微软消息队列,是在多个不同应用之间实现相互通信的一种异步传输模式,相互通信的应用可以分布于同一 ...

  2. WIN10 新建ORACLE实例

    1 管理员身份进入CMD环境,执行DBCA命令,在弹出窗口的引导中,完成实例创建 2 如果在创建过程中没有选择适当的字符集(最好采用默认字符集),如下图所示,在进入PLSQL DEVELOPER的时候 ...

  3. 攻城狮在路上(肆)How tomcat works(一) 简单的web服务器

     该节总共三个类:Request\Response\HttpServer---user.dir     该节的目的是实现简单web服务器对静态文件的访问.需要对请求头.请求体的格式有所了解,不然就没有 ...

  4. ARM寻址方式,王明学learn

    ARM寻址方式 所谓寻址方式就是处理器根据指令中给出的信息来找到指令所需操作数的方式. 一.立即数寻址 立即数寻址,是一种特殊的寻址方式,操作数本身就在指令中给出,只要取出指令也就取到了操作数.这个操 ...

  5. 第二篇:SOUI源码的获取及编译

    源代码的获取 SOUI的源码采用SVN管理. SVN:http://code.taobao.org/svn/soui2 这里主要包含两个目录:trunk 及 third-part. trunk目录保存 ...

  6. the last lecture

    2008.07.25,CMU教授Randy Pausch教授因癌症去世,仅47岁. 几年之前,当我看到Pausch先生最后一课的视频时,让我震撼. 转眼之间,7年过去了,这7年,让我成长了许多. 7年 ...

  7. 为什么要使用 Node.js

    这是一个移动端工程师涉足前端和后端开发的学习笔记,如有错误或理解不到位的地方,万望指正. Node.js 是什么 传统意义上的 JavaScript 运行在浏览器上,这是因为浏览器内核实际上分为两个部 ...

  8. Android开发工具之Dash

    作为一名死coder,每天最常见的动作就是查看各种API文档,你一定也有过同时打开N个窗口(HTML.PDF.CHM),不停的在编辑器与文档之间切换的感受吧?怎么说呢,其实我很讨厌这种枯燥无味的动作, ...

  9. Linux C编程(1) vim及gcc命令

    1. 输入以下命令可以启动vi:      (1) vi:不指定文件名,在保存文件时需要指定文件名.      (2) vi 文件名:该文件既可以是已存在的,也可以是新建的.      (3) vi ...

  10. codeforces733-C. Epidemic in Monstropolis 贪心加链表

    题意 现在有一个怪兽序列a[i],权值大的怪兽可以吃权值小的怪兽,吃完之后权值大的怪兽的权值会变成两者权值的和,相邻的怪兽才能吃 吃完之后,位置合并,队列前移,从左到右重新编号,重复这一过程, 然后给 ...