【BZOJ】2194: 快速傅立叶之二
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: 快速傅立叶之二的更多相关文章
- 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
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2194 如果把 a 序列翻转,则卷积得到的是 c[n-i],再把得到的 c 序列翻转即可. 代 ...
- [BZOJ]2194: 快速傅立叶之二
题目大意:给定序列a,b,求序列c满足c[k]=sigma(a[i]*b[i-k]) (k<=i<n).(n<=10^5) 思路:观察发现就是普通的卷积反一反(翻转ab其中一个后做卷 ...
- 【刷题】BZOJ 2194 快速傅立叶之二
Description 请计算C[k]=sigma(a[i]*b[i-k]) 其中 k < = i < n ,并且有 n < = 10 ^ 5. a,b中的元素均为小于等于100的非 ...
- 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
[题目分析] 咦,这不是卷积裸题. 敲敲敲,结果样例也没过. 看看看,卧槽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 快速傅立叶变换之二 | FFT
BZOJ 2194 快速傅立叶变换之二 题意 给出两个长为\(n\)的数组\(a\)和\(b\),\(c_k = \sum_{i = k}^{n - 1} a[i] * b[i - k]\). 题解 ...
- 【BZOJ 2194】2194: 快速傅立叶之二(FFT)
2194: 快速傅立叶之二 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 1273 Solved: 745 Description 请计算C[k]= ...
随机推荐
- Overview and Evaluation of Bluetooth Low Energy: An Emerging Low-Power Wireless Technology
转自:http://www.mdpi.com/1424-8220/12/9/11734/htm Sensors 2012, 12(9), 11734-11753; doi:10.3390/s12091 ...
- wifi 4次握手
转自:http://zhaoxiaobu.blog.51cto.com/878176/407130/ 不管是用WEP加密,还是用WPA,一般如果我们要和AP建立一个连接,要经过两个阶段认证(Authe ...
- 移除IIS默认的响应头(转载)
转载地址:http://www.cnblogs.com/dudu/p/iis-remove-response-readers.html 在IIS+ASP.NET的运行环境,默认情况下会输出以下的响应头 ...
- Newtonsoft.Json(Json.Net)学习笔记-高级使用(转)
1.忽略某些属性 2.默认值的处理 3.空值的处理 4.支持非公共成员 5.日期处理 6.自定义序列化的字段名称 7.动态决定属性是否序列化 8.枚举值的自定义格式化问题 9.自定义类型转换 10.全 ...
- 实现VS2010整合NUnit进行单元测试(转载)
代码编写,单元测试必不可少,简单谈谈Nunit进行单元测试的使用方式: 1.下载安装NUnit(最新win版本为NUnit-2.6.4.msi) http://www.nunit.org/index. ...
- 【PHP的异常处理【完整】】
PHP的异常处理机制大多数和java的很相似,但是没有finally,而且还可以自定义顶级异常处理器:捕捉到异常信息后,会跳出try-catch块,如果catch中没有跳转的动作,则会继续执行下一条语 ...
- mac os x使用技巧及常用软件
常见键盘符号:⌘(command).⌥(option).⇧(shift).⇪(caps lock).⌃(control) 常用快捷键 复制 Command+c / Option+拖拽 粘贴 Com ...
- hdu 5033 单调栈 ****
看出来是单调栈维护斜率,但是不会写,2333,原来是和询问放在一起的 #include <iostream> #include <cstdio> #include <cs ...
- hdu 4038 2011成都赛区网络赛H 贪心 ***
贪心策略 1.使负数为偶数个,然后负数就不用管了 2.0变为1 3.1变为2 4.2变为3 5.若此时操作数剩1,则3+1,否则填个1+1,然后回到5
- Android开发如何去除标题栏title(转)
去除标题栏title其实非常简单,他有两种方法,一种是在代码中添加,另一种是在AndroidManifest.xml中添加: 1.在代码中实现:在此方法setContentView(R.layout. ...