码迷,mamicode.com
首页 > 其他好文 > 详细

BZOJ2194 快速傅立叶之二

时间:2014-12-26 00:53:15      阅读:204      评论:0      收藏:0      [点我收藏+]

标签:

于是标题又暴露了一切

把b倒过来读进来,就变成了卷积(那是什么。。。?可以吃吗?)的形式

于是直接FFT一下就好了

 

技术分享
 1 /**************************************************************
 2     Problem: 2194
 3     User: rausen
 4     Language: C++
 5     Result: Accepted
 6     Time:2760 ms
 7     Memory:21900 kb
 8 ****************************************************************/
 9  
10 #include <cstdio>
11 #include <cmath>
12 #include <algorithm>
13  
14 #define complex P
15 using namespace std;
16 typedef double lf;
17 const int N = 300005;
18 const lf pi = acos(-1);
19  
20 struct complex {
21     lf x, y;
22     P() {}
23     P(lf _x, lf _y) : x(_x), y(_y) {}
24      
25     inline P operator + (const P &X) const {
26         return P(x + X.x, y + X.y);
27     }
28     inline P operator - (const P &X) const {
29         return P(x - X.x, y - X.y);
30     }
31     inline P operator * (const P &X) const {
32         return P(x * X.x - y * X.y, x * X.y + y * X.x);
33     }
34      
35     inline void operator += (const P &X) {
36         *this = *this + X;
37     }
38     inline void operator *= (const P &X) {
39         *this = *this * X;
40     }
41 } x[N], y[N], w[2][N];
42  
43 int n, len;
44 int a[N], b[N];
45  
46 inline int read() {
47     int x = 0;
48     char ch = getchar();
49     while (ch < 0 || 9 < ch)
50         ch = getchar();
51     while (0 <= ch && ch <= 9) {
52         x = x * 10 + ch - 0;
53         ch = getchar();
54     }
55     return x;
56 }
57  
58 void FFT(P *x, int len, int v) {
59     int i, j, l;
60     P tmp;
61     for (i = j = 0; i < len; ++i) {
62         if (i > j) swap(x[i], x[j]);
63         for (l = len >> 1; (j ^= l) < l; l >>= 1);
64     }
65     for (i = 2; i <= len; i <<= 1)
66         for (j = 0; j < len; j += i)
67             for (l = 0; l < i >> 1; ++l) {
68                 tmp = x[j + l + (i >> 1)] * w[v][len / i * l];
69                 x[j + l + (i >> 1)] = x[j + l] - tmp;
70                 x[j + l] += tmp;
71             }
72 }
73  
74 void work() {
75     int i;
76     for (len = 1; len < n << 1; len <<= 1);
77     for (i = 0; i <= len; ++i)
78         w[1][len -  i] = w[0][i] = P(cos(pi * 2 * i / len), sin(pi * 2 * i / len));
79          
80     for (i = 0; i < len; ++i)
81         x[i] = P(a[i], 0), y[i] = P(b[i], 0);
82     FFT(x, len, 0), FFT(y, len, 0);
83      
84     for (i = 0; i < len; ++i)
85         x[i] *= y[i];
86     FFT(x, len, 1);
87  
88     for (i = n - 1; i + 1 < n << 1; ++i)
89         printf("%d\n", (int) round(x[i].x / len));
90 }
91  
92 int main() {
93     int i;
94     n = read();
95     for (i = 0; i < n; ++i)
96         a[i] = read(), b[n - i - 1] = read();
97     work();
98     return 0;
99 }
View Code

(p.s.  Xs我回来啦!!!)

BZOJ2194 快速傅立叶之二

标签:

原文地址:http://www.cnblogs.com/rausen/p/4185825.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!