Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- const int MOD = (int) 1e9 + 7;
- long long Karatsuba(long long x, long long y) {
- // ((10 ^ 6) * a + b) * ((10 ^ 6) * c + d)
- // = ((10 ^ 12) * a * c) + ((10 ^ 6) * ((a * d) + (b * c))) + (b * d)
- // where a, b, c, are (10 ^ 6)-digit numbers
- long long a = x / 1000000;
- long long b = x % 1000000;
- long long c = y / 1000000;
- long long d = y % 1000000;
- // first expression = ((10 ^ 12) * a * c)
- long long first_expression = ((1000000000000LL * a % MOD) * c) % MOD;
- // second expression = ((10 ^ 6) * ((a * d) + (b * c)))
- long long second_expression = (1000000 * (((a * d) + (b * c)) % MOD)) % MOD;
- // third expression = (b * d)
- long long third_expression = b * d;
- return ((first_expression + second_expression + third_expression) % MOD);
- }
- int main() {
- // constraints: 1 <= x, y <= (10 ^ 12)
- // note: answer must be computed to modulo ((10 ^ 9) + 7)
- long long x, y;
- cin >> x >> y;
- cout << Karatsuba(x, y) << '\n';
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement