bhupixb

Modulo struct

Feb 8th, 2020
114
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.45 KB | None | 0 0
  1. struct mod_int {
  2. int val;
  3. mod_int(long long v = 0) {
  4. if (v < 0) v = v % MOD + MOD;
  5. if (v >= MOD) v %= MOD;
  6. val = v;
  7. }
  8.  
  9. static int mod_inv(int a, int m = MOD) {
  10. int g = m, r = a, x = 0, y = 1;
  11. while (r != 0) {
  12. int q = g / r;
  13. g %= r; swap(g, r);
  14. x -= q * y; swap(x, y);
  15. }
  16. return x < 0 ? x + m : x;
  17. }
  18.  
  19. mod_int& operator+=(const mod_int &other) {
  20. val += other.val;
  21. if (val >= MOD) val -= MOD;
  22. return *this;
  23. }
  24.  
  25. mod_int& operator-=(const mod_int &other) {
  26. val -= other.val;
  27. if (val < 0) val += MOD;
  28. return *this;
  29. }
  30.  
  31. static unsigned fast_mod(uint64_t x, unsigned m = MOD) {
  32. return x % m;
  33. }
  34.  
  35. mod_int& operator*=(const mod_int &other) {
  36. val = fast_mod((uint64_t) val * other.val);
  37. return *this;
  38. }
  39.  
  40. mod_int& operator/=(const mod_int &other) {
  41. return *this *= other.inv();
  42. }
  43.  
  44. friend mod_int operator+(const mod_int &a, const mod_int &b) { return mod_int(a) += b; }
  45. friend mod_int operator-(const mod_int &a, const mod_int &b) { return mod_int(a) -= b; }
  46. friend mod_int operator*(const mod_int &a, const mod_int &b) { return mod_int(a) *= b; }
  47. friend mod_int operator/(const mod_int &a, const mod_int &b) { return mod_int(a) /= b; }
  48.  
  49. mod_int& operator++() {
  50. val = val == MOD - 1 ? 0 : val + 1;
  51. return *this;
  52. }
  53.  
  54. mod_int& operator--() {
  55. val = val == 0 ? MOD - 1 : val - 1;
  56. return *this;
  57. }
  58.  
  59. mod_int operator++(int) { mod_int before = *this; ++*this; return before; }
  60. mod_int operator--(int) { mod_int before = *this; --*this; return before; }
  61.  
  62. mod_int operator-() const {
  63. return val == 0 ? 0 : MOD - val;
  64. }
  65.  
  66. bool operator==(const mod_int &other) const { return val == other.val; }
  67. bool operator!=(const mod_int &other) const { return val != other.val; }
  68.  
  69. mod_int inv() const {
  70. return mod_inv(val);
  71. }
  72.  
  73. mod_int pow(long long p) const {
  74. assert(p >= 0);
  75. mod_int a = *this, result = 1;
  76.  
  77. while (p > 0) {
  78. if (p & 1)
  79. result *= a;
  80.  
  81. a *= a;
  82. p >>= 1;
  83. }
  84.  
  85. return result;
  86. }
  87.  
  88. friend ostream& operator<<(ostream &stream, const mod_int &m) {
  89. return stream << m.val;
  90. }
  91. };
Add Comment
Please, Sign In to add comment