Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- void multiply(vector < uint > a, vector < uint > b, vector < uint > &res) {
- if (a.size() == 1) {
- res = b;
- fori(b.size()) res[i] *= a[0];
- return ;
- }
- if (b.size() == 1) {
- res = a;
- fori(a.size()) res[i] *= b[0];
- return ;
- }
- if (a.size() + b.size() <= 10) {
- res.resize(a.size() + b.size() - 1);
- for (int i = 0; i < a.size(); i++) {
- for (int j = 0; j < b.size(); j++) {
- res[i + j] += (a[i] * b[j]);
- }
- }
- return ;
- }
- int cnt1 = a.size(), cnt2 = b.size();
- if (a.size() > b.size()) {
- while (a.size() != b.size()) b.pb(0);
- } else if (a.size() < b.size()) {
- while (a.size() != b.size()) a.pb(0);
- }
- if (a.size() != b.size()) {
- //cout << cnt1 << " " << cnt2 << "\n";
- //cout << a.size() << " " << b.size() << "\n";
- while (true) {}
- exit(0);
- }
- int m = (a.size() + 1) / 2;
- vector < uint > a0, a1, b0, b1;
- vector < uint > a0b0, a1b1;
- a0.resize(m);
- b0.resize(m);
- a1.resize(a.size() - m);
- b1.resize(b.size() - m);
- for (int i = 0; i < m; i++) a0[i] = a[i];
- for (int i = m; i < a.size(); i++) a1[i - m] = a[i];
- for (int i = 0; i < m; i++) b0[i] = b[i];
- for (int i = m; i < b.size(); i++) b1[i - m] = b[i];
- multiply(a0, b0, a0b0);
- multiply(a1, b1, a1b1);
- sum(a0, a1);
- sum(b0, b1);
- vector < uint > keks1;
- multiply(a0, b0, keks1);
- //for (auto c: keks1) cout << c << " ";
- //cout << "\n";
- substraction(keks1, a0b0);
- substraction(keks1, a1b1);
- res.resize(a.size() + b.size() - 1);
- for (int i = 0; i < a0b0.size(); i++) {
- res[i] += a0b0[i];
- }
- for (int i = m; i - m < keks1.size(); i++) {
- res[i] += keks1[i - m];
- }
- for (int i = 2 * m; i - 2 * m < a1b1.size(); i++) {
- res[i] += a1b1[i - 2 * m];
- }
- while (true) {
- if (res.back() == 0) res.pop_back();
- else break;
- }
- return ;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement