Submission #66499

#TimeUsernameProblemLanguageResultExecution timeMemory
66499IOrtroiiiMultiply (CEOI17_mul)C++14
100 / 100
70 ms9168 KiB
#include <bits/stdc++.h> using namespace std; const int N = 1 << 17; const double PI = acos(-1); typedef complex<double> base; int n; int rev[N]; void calc_rev(int n,int logn) { for (int i = 0; i < n; ++i) { rev[i] = 0; for (int j = 0; j < logn; ++j) if ((i >> j) & 1) { rev[i] |= (1 << (logn - 1 - j)); } } } void fft(base a[], int n, bool invert) { for (int i = 0; i < n; ++i) if (i < rev[i]) swap(a[i], a[rev[i]]); for (int len = 2; len <= n; len <<= 1) { double alpha = 2 * PI / len * (invert ? -1 : 1); base wl = base(cos(alpha), sin(alpha)); for (int i = 0; i < n; i += len) { base w = base(1); for (int j = 0; j < (len >> 1); ++j) { base u = a[i + j], v = a[i + j + (len >> 1)] * w; a[i + j] = u + v; a[i + j + (len >> 1)] = u - v; w *= wl; } } } if (invert) { for (int i = 0; i < n; ++i) a[i] /= n; } } vector<int> mult(vector<int> a, vector<int> b) { static base fa[N], fb[N], fc[N]; int na = a.size(), nb = b.size(); int n = 1, logn = 0; while (n < max(na, nb)) n <<= 1, logn++; n <<= 1, logn++; calc_rev(n, logn); for (int i = 0; i < n; ++i) fa[i] = fb[i] = base(0); for (int i = 0; i < na; ++i) fa[i] = base(a[i]); for (int i = 0; i < nb; ++i) fb[i] = base(b[i]); fft(fa, n, 0), fft(fb, n, 0); for (int i = 0; i < n; ++i) fc[i] = fa[i] * fb[i]; fft(fc, n, 1); vector<int> ret; for (int i = 0; i < na + nb - 1; ++i) ret.push_back((int)(fc[i].real() + 0.5)); return ret; } int main() { ios_base::sync_with_stdio(false); int n, m; string s, t; cin >> n >> m >> s >> t; vector<int> a, b; for (char c : s) a.push_back(c - '0'); for (char c : t) b.push_back(c - '0'); reverse(a.begin(), a.end()); reverse(b.begin(), b.end()); // for (int x : a) cout << x << ' '; cout << '\n'; // for (int x : b) cout << x << ' '; cout << '\n'; vector<int> c = mult(a, b); c.push_back(0); // for (int x : c) cout << x << ' '; cout << '\n'; for (int i = 0; i < c.size() - 1; ++i) { c[i + 1] += c[i] / 10; c[i] %= 10; } while (c.size() > 1 && !c.back()) c.pop_back(); reverse(c.begin(), c.end()); for (int x : c) cout << x; }

Compilation message (stderr)

mul.cpp: In function 'int main()':
mul.cpp:75:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for (int i = 0; i < c.size() - 1; ++i) {
                  ~~^~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...