Skip to Content
Team NoteUtilsModular int

Modular int

<template name="TEMPLATE: mint" value="struct mint {&#10; int val;&#10; mint() { val = 0; }&#10; mint(const ll &amp;v) {&#10; val = (-mod &lt;= v &amp;&amp; v &lt; mod) ? v : v % mod;&#10; if (val &lt; 0)&#10; val += mod;&#10; }&#10;&#10; friend ostream &amp;operator&lt;&lt;(ostream &amp;os, const mint &amp;a) { return os &lt;&lt; a.val; }&#10; friend bool operator==(const mint &amp;a, const mint &amp;b) { return a.val == b.val; }&#10; friend bool operator!=(const mint &amp;a, const mint &amp;b) { return !(a == b); }&#10; friend bool operator&lt;(const mint &amp;a, const mint &amp;b) { return a.val &lt; b.val; }&#10;&#10; mint operator-() const { return mint(-val); }&#10; mint &amp;operator+=(const mint &amp;m) {&#10; if ((val += m.val) &gt;= mod)&#10; val -= mod;&#10; return *this;&#10; }&#10; mint &amp;operator-=(const mint &amp;m) {&#10; if ((val -= m.val) &lt; 0)&#10; val += mod;&#10; return *this;&#10; }&#10; mint &amp;operator*=(const mint &amp;m) {&#10; val = (lint)val * m.val % mod;&#10; return *this;&#10; }&#10; friend mint ipow(mint a, lint p) {&#10; mint ans = 1;&#10; for (; p; p /= 2, a *= a)&#10; if (p &amp; 1)&#10; ans *= a;&#10; return ans;&#10; }&#10; friend mint inv(const mint &amp;a) {&#10; assert(a.val);&#10; return ipow(a, mod - 2);&#10; }&#10; mint &amp;operator/=(const mint &amp;m) { return (*this) *= inv(m); }&#10;&#10; friend mint operator+(mint a, const mint &amp;b) { return a += b; }&#10; friend mint operator-(mint a, const mint &amp;b) { return a -= b; }&#10; friend mint operator*(mint a, const mint &amp;b) { return a *= b; }&#10; friend mint operator/(mint a, const mint &amp;b) { return a /= b; }&#10; operator int64_t() const { return val; }&#10;};" description="" toReformat="false" toShortenFQNames="true"> <context> <option name="cpp" value="true" /> </context> </template>
Last updated on