Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- void multiply(std::vector<int> &a, std::vector<int> &b, std::vector<int> &res) {
- if(std::max(a.size(), b.size()) < 100) {
- simple_multiply(a, b, res);
- return;
- }
- if(a.size() < b.size()) {
- std::swap(a, b);
- }
- while(b.size() < a.size()) {
- b.push_back(0);
- }
- while((b.size() & 1)) {
- a.push_back(0);
- b.push_back(0);
- }
- int mid = a.size() / 2;
- std::vector<int> al, ar, bl, br;
- for(int i = 0; i < a.size(); i++) {
- if(i < mid) {
- al.push_back(a[i]);
- bl.push_back(b[i]);
- }
- else {
- ar.push_back(a[i]);
- br.push_back(b[i]);
- }
- }
- std::vector<int> r1, r2, r3, r4;
- std::vector<int> kl, kr;
- sum(al, ar, kl);
- sum(bl, br, kr);
- multiply(al, bl, r1);
- multiply(kl, kr, r2);
- multiply(ar, br, r4);
- reverse(r1.begin(), r1.end());
- reverse(r2.begin(), r2.end());
- reverse(r4.begin(), r4.end());
- decrease(r2, r1, r3);
- decrease(r3, r4, r2);
- for(int i = 0; i < mid; i++) {
- r2.push_back(0);
- }
- for(int i = 0; i < 2 * mid; i++) {
- r4.push_back(0);
- }
- reverse(r1.begin(), r1.end());
- reverse(r2.begin(), r2.end());
- reverse(r4.begin(), r4.end());
- sum(r1, r2, res);
- std::vector<int> res2;
- sum(res, r4, res2);
- res = res2;
- }
- };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement