随便代换一下把它变成多项式乘法,及$C[T]=\sum_{i=0}^{T}A[i]×B[T-i]$这种形式,然后FFT求一下就可以啦

#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define read(x) x=getint()
using namespace std;
const int N = 400003;
const double Pi = acos(- 1.0);
int getint() {
int k = 0, fh = 1; char c = getchar();
for(; c < '0' || c > '9'; c = getchar())
if (c == '-') fh = -1;
for(; c >= '0' && c <= '9'; c = getchar())
k = k * 10 + c - '0';
return k * fh;
}
struct cp {
double r, i;
cp (double _r = 0.0, double _i = 0.0) : r(_r), i(_i) {}
cp operator + (const cp &x) {return cp(r + x.r, i + x.i);}
cp operator - (const cp &x) {return cp(r - x.r, i - x.i);}
cp operator * (const cp &x) {return cp(r * x.r - i * x.i, r * x.i + i * x.r);}
};
cp A[N], u, t;
int rev[N];
void DFT(cp *a, int n, int flag) {
for(int i = 0; i < n; ++i) A[rev[i]] = a[i];
for(int i = 0; i < n; ++i) a[i] = A[i];
for(int m = 2; m <= n; m <<= 1) {
cp wn(cos(2.0 * Pi / m * flag), sin(2.0 * Pi / m * flag));
int mid = m >> 1;
for(int i = 0; i < n; i += m) {
cp w(1.0);
for(int j = 0; j < mid; ++j) {
u = a[i + j], t = a[i + j + mid] * w;
a[i + j] = u + t;
a[i + j + mid] = u - t;
w = w * wn;
}
}
}
if (flag == -1)
for(int i = 0; i < n; ++i)
a[i].r /= n;
}
void init(int &n) {
int k = 1, ret, L = 0;
for(; k < n; k <<= 1, ++L);
n = k;
for(int i = 0; i < n; ++i) {
k = i; ret = 0;
for(int j = 0; j < L; ++j)
ret <<= 1, ret |= k & 1, k >>= 1;
rev[i] = ret;
}
}
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].r = a[i], x[i].i = 0;
for(int i = 0; i < len; ++i)
y[i].r = b[i], y[i].i = 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] = (int) (x[i].r + 0.5);
}
int x[N], y[N], a[N], n;
int main() {
read(n);
for(int i = 0; i < n; ++i)
read(x[i]), read(y[i]);
for(int i = 0; i < n; ++i)
a[i] = x[n - i - 1];
FFT(y, a, x, n, n);
for(int i = 0; i < n; ++i)
a[i] = x[n - i - 1];
for(int i = 0; i < n; ++i)
printf("%d\n", a[i]);
return 0;
}

233

【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]= ...

  10. 【BZOJ】2194: 快速傅立叶之二

    http://www.lydsy.com/JudgeOnline/problem.php?id=2194 题意:求$c[k]=\sum_{k<=i<n} a[i]b[i-k], n< ...

随机推荐

  1. 带权图的最短路径算法(Dijkstra)实现

    一,介绍 本文实现带权图的最短路径算法.给定图中一个顶点,求解该顶点到图中所有其他顶点的最短路径 以及 最短路径的长度.在决定写这篇文章之前,在网上找了很多关于Dijkstra算法实现,但大部分是不带 ...

  2. Episode 388: Testing vs Monitoring

    A user-facing bug causes search results to be unavailable for your service. Someone suggests adding ...

  3. 原生的强大DOM选择器querySelector

    在传统的 JavaScript 开发中,查找 DOM 往往是开发人员遇到的第一个头疼的问题,原生的 JavaScript 所提供的 DOM 选择方法并不多,仅仅局限于通过 tag, name, id ...

  4. POJ2743Mobile Computing[DFS 状态压缩]

    Mobile Computing Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 666   Accepted: 224   ...

  5. 分层开发之MySchool

    No.1实现登陆功能,验证用户名和密码.从数据库里进行匹配,看是否有符合要求的数据. 在DAL层编写代码,返回值为布尔类型.方法参数为(student实体类对象),使用参数化SqlParameter类 ...

  6. JQuery获取元素的方法总结

    JQuery获取元素的方法总结 一.说明   获取元素的方法分为两种:jQuery选择器.jQuery遍历函数. 做个总结,巩固下知识. 二.获取本身 1.只需要一种jQuery选择器   选择器 实 ...

  7. 微软云Azure Website 远程调试

    微软云Azure Website 远程调试 是可以的 但是只有48小时,要在后台开启,所以还是很麻烦的啊! 但是安全性提高了,不得不承认哦

  8. poj 3468

    A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 90736 Acc ...

  9. Linux下误删除后的恢复操作(ext3/ext4)

    Linux是作为一个多用户.多任务的操作系统,文件一旦被删除是难以恢复的.尽管删除命令只是在文件节点中作删除标记,并不真正清除文件内容,但是其他用户和一些有写盘动作的进程会很快覆盖这些数据.在日常工程 ...

  10. 由项目中一个hash2int函数引发的思考

    hash2int /** * 计算一个字符串的md5折算成int返回 * @param type $str * @return type */ function hash2int($str) { $m ...