#include <iostream>
#include <cassert>
using namespace std;
int multiply(int a, int b, int mod) {
if (b == 0) {
// a * 0 = 0
return 0;
} else {
// b = 2k + r
int k = b / 2;
int r = b % 2;
// a * (2k + r) = 2a * k + a * r
return (multiply(a * 2 % mod, k, mod) + a * r) % mod;
}
}
void test(int a, int b) {
int mod = 1e9 + 7;
int result = multiply(a, b, mod);
int expected = a * (long long) b % mod;
assert(result == expected);
cout << result << " " << expected << endl;
}
int main() {
srand(time(nullptr));
test(3, 5);
test(5, 3);
test(100, 100);
test(777, 77777);
test(50000, 50000);
test(100000, 100000);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y2Fzc2VydD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmludCBtdWx0aXBseShpbnQgYSwgaW50IGIsIGludCBtb2QpIHsKICAgIGlmIChiID09IDApIHsKICAgICAgICAvLyBhICogMCA9IDAKICAgICAgICByZXR1cm4gMDsKICAgIH0gZWxzZSB7CiAgICAgICAgLy8gYiA9IDJrICsgcgogICAgICAgIGludCBrID0gYiAvIDI7CiAgICAgICAgaW50IHIgPSBiICUgMjsKCiAgICAgICAgLy8gYSAqICgyayArIHIpID0gMmEgKiBrICsgYSAqIHIKICAgICAgICByZXR1cm4gKG11bHRpcGx5KGEgKiAyICUgbW9kLCBrLCBtb2QpICsgYSAqIHIpICUgbW9kOwogICAgfQp9Cgp2b2lkIHRlc3QoaW50IGEsIGludCBiKSB7CiAgICBpbnQgbW9kID0gMWU5ICsgNzsKICAgIGludCByZXN1bHQgPSBtdWx0aXBseShhLCBiLCBtb2QpOwogICAgaW50IGV4cGVjdGVkID0gYSAqIChsb25nIGxvbmcpIGIgJSBtb2Q7CiAgICBhc3NlcnQocmVzdWx0ID09IGV4cGVjdGVkKTsKICAgIGNvdXQgPDwgcmVzdWx0IDw8ICIgIiA8PCBleHBlY3RlZCA8PCBlbmRsOwp9CgppbnQgbWFpbigpIHsKICAgIHNyYW5kKHRpbWUobnVsbHB0cikpOwogICAgdGVzdCgzLCA1KTsKICAgIHRlc3QoNSwgMyk7CiAgICB0ZXN0KDEwMCwgMTAwKTsKICAgIHRlc3QoNzc3LCA3Nzc3Nyk7CiAgICB0ZXN0KDUwMDAwLCA1MDAwMCk7CiAgICB0ZXN0KDEwMDAwMCwgMTAwMDAwKTsKfQ==