fork download
  1. #include <cstdio>
  2.  
  3. using namespace std;
  4.  
  5. unsigned long long mul_mod(unsigned long long a, unsigned long long b, unsigned long long m) {
  6. unsigned long long d = 0, mp2 = m >> 1;
  7. if (a >= m) a %= m;
  8. if (b >= m) b %= m;
  9. for (int i = 0; i < 64; i++)
  10. {
  11. d = (d > mp2) ? (d << 1) - m : d << 1;
  12. if (a & 0x8000000000000000ULL)
  13. d += b;
  14. if (d >= m) d -= m;
  15. a <<= 1;
  16. }
  17. return d;
  18. }
  19.  
  20. int main() {
  21. unsigned long long a = 3, b = 0x7FFFFFFFFFFFFFFFULL, m = 0xFFFFFFFFFFFFFFFFULL;
  22. unsigned long long result = mul_mod(a, b, m);
  23. printf("%llX * %llX mod %llX = %llX\n", a, b, m, result);
  24. return 0;
  25. }
  26.  
Success #stdin #stdout 0s 5528KB
stdin
Standard input is empty
stdout
3 * 7FFFFFFFFFFFFFFF mod FFFFFFFFFFFFFFFF = 7FFFFFFFFFFFFFFD