UOJ 34 FFT

链接:

http://uoj.ac/problem/34

代码:

31 #include <complex>
32 typedef complex<double> E;
33 E a[MAXN], b[MAXN];
34 int n, m;
35
36 namespace FFT {
37     const double Pi = acos(-1);
38     int rev[MAXN], L;
39     void DFT(E *a, int f) {
40         for (int i = 0; i < n; i++) if (i < rev[i]) swap(a[i], a[rev[i]]);
41         for (int i = 1; i < n; i <<= 1) {
42             E wn(cos(Pi / i), f*sin(Pi / i));
43             for (int p = i << 1, j = 0; j < n; j += p) {
44                 E w(1, 0);
45                 for (int k = 0; k < i; k++, w *= wn) {
46                     E x = a[j + k], y = w*a[j + k + i];
47                     a[j + k] = x + y; a[j + k + i] = x - y;
48                 }
49             }
50         }
51         if (f == -1) for (int i = 0; i < n; i++) a[i] /= n;
52     }
53     void main() {
54         m = n + m;
55         for (n = 1; n <= m; n <<= 1) L++;
56         for (int i = 0; i < n; i++) rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << (L - 1));
57         DFT(a, 1); DFT(b, 1);
58         for (int i = 0; i < n; i++) a[i] = a[i] * b[i];
59         DFT(a, -1);
60     }
61 }
62
63 int main() {
64     cin >> n >> m;
65     int x;
66     rep(i, 0, n + 1) scanf("%d", &x), a[i] = x;
67     rep(i, 0, m + 1) scanf("%d", &x), b[i] = x;
68     FFT::main();
69     for (int i = 0; i <= m; i++) printf("%d ", (int)(a[i].real() + 0.5));
70     return 0;
71 }
时间: 2024-10-12 15:47:31

UOJ 34 FFT的相关文章

UOJ #34 多项式乘法 FFT快速傅立叶变换

题目大意:这是一道模板题. CODE: #include <cmath> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define MAX 1000010 using namespace std; const double PI = acos(-1.0); struct Complex{ double x,y; Complex(dou

[uoj#34] [洛谷P3803] 多项式乘法(FFT)

新技能--FFT. 可在 \(O(nlogn)\) 时间内完成多项式在系数表达与点值表达之间的转换. 其中最关键的一点便为单位复数根,有神奇的折半性质. 多项式乘法(即为卷积)的常见形式: \[ C_n=\sum\limits_{i=0}^n A_iB_{n-i} \] 基本思路为先将系数表达 -> 点值表达 \(O(nlogn)\) 随后点值 \(O(n)\) 进行乘法运算 最后将点值表达 -> 系数表达 \(O(nlogn)\) 代码 #include<cstdio> #inc

●UOJ 34 多项式乘法

题链: http://uoj.ac/problem/34 题解: FFT入门题. (终于接触到迷一样的FFT了) 初学者在对复数和单位根有简单了解的基础上,可以直接看<再探快速傅里叶变换>(毛啸). (主要用于求两个序列的卷积) 代码: 递归版: #include<bits/stdc++.h> #define MAXN 300000 using namespace std; const double Pi=acos(-1); struct Z{ double real,image;

UOJ #34 多项式乘法

题目链接:多项式乘法 保存一发FFT与NTT板子. 学习链接:从多项式乘法到快速傅里叶变换 FFT NTT 注意差值回来的时候不取反也是可以的,只不过需要把数组\(reverse\)一下(根据单位复数根的性质应该不难理解) 代码(FFT): #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<co

联赛之前的题表(已完成)汇总(可能有遗漏)

联赛之前的搞搞(其实是懒得分类) 博弈论 poj3537 poj1704 hdu5996两个插头 HDU1693 Eat the Trees COGS1283. [HNOI2004] 邮递员kdtree板子1941: [Sdoi2010]Hide and Seek旋转卡壳 pj2187凸包 cogs896 bzoj2829 信用卡凸包莫比乌斯反演基础 bzoj 4173 zhao gui lv bzoj 3529 mobiwus bzoj 4407 mobiwus bzoj 2818 mobiw

【UOJ】【34】多项式乘法

快速傅里叶变换模板题 算法理解请看<算法导论>第30章<多项式与快速傅里叶变换>,至于证明插值唯一性什么的看不懂也没关系啦-只要明白这个过程是怎么算的就ok. 递归版:(4252ms  23468kb) 1 //UOJ 34 递归版 2 #include<cmath> 3 #include<vector> 4 #include<cstdio> 5 #include<cstring> 6 #include<cstdlib>

【FFT】专题总结

学了若干天终于学(bei)会了传说中的法法塔 感觉也没那么难用嘛 fft快速傅里叶变换 在大表课件上写就是解决高精乘的工具 其实很有理有据 fft就是用复数的折半引理优化两个多项式相乘的高端东西 他能使O(n^2)的多项式相乘优化到O(nlogn) 听ak说这也是比较模板的东西 也就不去理解什么证明了(其实是我看了半天看不懂TAT) 贴个代码吧(史上最短总结233- -) 1 int bit_rev(int t,int n){ 2 int res=0; 3 for (int i=0;i<n;i+

【算法总结】多项式相关

[快速傅里叶变换] [相关资料] <虚数的图解>        <虚数的意义>        <FFT学习笔记> <从多项式乘法到快速傅里叶变换>        <Fast Fourier Transform> <[快速傅里叶变换][FFT][WikiOI][P3132][高精度练习之超大整数乘法]> [模板代码] [FFT] 1 const double pi=acos(-1); 2 struct cpx{double r,i;cp

Java面试题-1

Java面试题 Java面试题 1 1.面向对象的特征有哪些方面? 6 2.访问修饰符public,private,protected,以及不写(默认)时的区别? 7 3.String 是最基本的数据类型吗? 8 4.float f=3.4;是否正确? 8 5.short s1 = 1; s1 = s1 + 1;有错吗?short s1 = 1; s1 += 1;有错吗? 8 6.Java有没有goto? 8 7.int和Integer有什么区别? 9 8.&和&&的区别? 11