-
Notifications
You must be signed in to change notification settings - Fork 13
Expand file tree
/
Copy path1067.cpp
More file actions
69 lines (66 loc) · 1.54 KB
/
1067.cpp
File metadata and controls
69 lines (66 loc) · 1.54 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#include <math.h>
#include <complex>
#include <vector>
#include <algorithm>
using namespace std;
#define M_PI 3.14159265358979323846
#define sz(v) ((int)(v).size())
#define all(v) (v).begin(),(v).end()
typedef complex<double> base;
void fft(vector <base> &a, bool invert)
{
int n = sz(a);
for (int i = 1, j = 0; i<n; i++) {
int bit = n >> 1;
for (; j >= bit; bit >>= 1) j -= bit;
j += bit;
if (i < j) swap(a[i], a[j]);
}
for (int len = 2; len <= n; len <<= 1) {
double ang = 2 * M_PI / len*(invert ? -1 : 1);
base wlen(cos(ang), sin(ang));
for (int i = 0; i<n; i += len) {
base w(1);
for (int j = 0; j<len / 2; j++) {
base u = a[i + j], v = a[i + j + len / 2] * w;
a[i + j] = u + v;
a[i + j + len / 2] = u - v;
w *= wlen;
}
}
}
if (invert) {
for (int i = 0; i<n; i++) a[i] /= n;
}
}
void multiply(const vector<int> &a, const vector<int> &b, vector<int> &res)
{
vector <base> fa(all(a)), fb(all(b));
int n = 1;
while (n < max(sz(a), sz(b))) n <<= 1;
fa.resize(n); fb.resize(n);
fft(fa, false); fft(fb, false);
for (int i = 0; i<n; i++) fa[i] *= fb[i];
fft(fa, true);
res.resize(n);
for (int i = 0; i<n; i++) res[i] = int(fa[i].real() + (fa[i].real()>0 ? 0.5 : -0.5));
}
int main(void) {
int N;
vector<int> X, Y;
vector<int> S;
scanf("%d", &N);
X.resize(2*N);
Y.resize(N);
for (int i = 0; i < N; i++) {
scanf("%d", &X[i]);
X[i + N] = X[i];
}
for (int i = 0; i < N; i++)
scanf("%d", &Y[N-1-i]);
multiply(X, Y, S);
int mx = -1;
for (int i = N; i < 2 * N; i++)
mx = max(mx, S[i]);
printf("%d", mx);
}