首页 > 代码库 > BZOJ2194 快速傅立叶之二
BZOJ2194 快速傅立叶之二
于是标题又暴露了一切
把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 P15 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 }
(p.s. Xs我回来啦!!!)
BZOJ2194 快速傅立叶之二
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。