#include <cstdio>
using namespace std;
unsigned long long mul_mod(unsigned long long a, unsigned long long b, unsigned long long m) {
unsigned long long d = 0, mp2 = m >> 1;
if (a >= m) a %= m;
if (b >= m) b %= m;
for (int i = 0; i < 64; i++)
{
d = (d > mp2) ? (d << 1) - m : d << 1;
if (a & 0x8000000000000000ULL)
d += b;
if (d >= m) d -= m;
a <<= 1;
}
return d;
}
int main() {
unsigned long long a = 3, b = 0x7FFFFFFFFFFFFFFFULL, m = 0xFFFFFFFFFFFFFFFFULL;
unsigned long long result = mul_mod(a, b, m);
printf("%llX * %llX mod %llX = %llX\n", a, b, m, result);
return 0;
}
I2luY2x1ZGUgPGNzdGRpbz4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp1bnNpZ25lZCBsb25nIGxvbmcgbXVsX21vZCh1bnNpZ25lZCBsb25nIGxvbmcgYSwgdW5zaWduZWQgbG9uZyBsb25nIGIsIHVuc2lnbmVkIGxvbmcgbG9uZyBtKSB7CiAgICB1bnNpZ25lZCBsb25nIGxvbmcgZCA9IDAsIG1wMiA9IG0gPj4gMTsKICAgIGlmIChhID49IG0pIGEgJT0gbTsKICAgIGlmIChiID49IG0pIGIgJT0gbTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNjQ7IGkrKykKICAgIHsKICAgICAgICBkID0gKGQgPiBtcDIpID8gKGQgPDwgMSkgLSBtIDogZCA8PCAxOwogICAgICAgIGlmIChhICYgMHg4MDAwMDAwMDAwMDAwMDAwVUxMKQogICAgICAgICAgICBkICs9IGI7CiAgICAgICAgaWYgKGQgPj0gbSkgZCAtPSBtOwogICAgICAgIGEgPDw9IDE7CiAgICB9CiAgICByZXR1cm4gZDsKfQoKaW50IG1haW4oKSB7Cgl1bnNpZ25lZCBsb25nIGxvbmcgYSA9IDMsIGIgPSAweDdGRkZGRkZGRkZGRkZGRkZVTEwsIG0gPSAweEZGRkZGRkZGRkZGRkZGRkZVTEw7Cgl1bnNpZ25lZCBsb25nIGxvbmcgcmVzdWx0ID0gbXVsX21vZChhLCBiLCBtKTsKCXByaW50ZigiJWxsWCAqICVsbFggbW9kICVsbFggPSAlbGxYXG4iLCBhLCBiLCBtLCByZXN1bHQpOwoJcmV0dXJuIDA7Cn0K