Guest User

Untitled

a guest
Dec 5th, 2025
214
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.92 KB | None | 0 0
  1. constexpr int mod = 1e9+7;
  2. struct mint {
  3.     // inner value
  4.     long long v;
  5.    
  6.     // constructor
  7.     constexpr mint() : v(0) { }
  8.     constexpr mint(long long v) : v(v % mod) {
  9.         if (v < 0) v += mod;
  10.     }
  11.     constexpr long long get() const { return v; }
  12.     constexpr int get_mod() const { return mod; }
  13.     explicit operator int() const { return v; }
  14.  
  15.     // arithmetic operators
  16.     constexpr mint operator + () const { return *this; }
  17.     constexpr mint operator - () const { return v ? mint(mod - v) : mint(0); }
  18.     friend constexpr mint operator + (mint l, const mint &r) { return l += r; }
  19.     friend constexpr mint operator - (mint l, const mint &r) { return l -= r; }
  20.     friend constexpr mint operator * (mint l, const mint &r) { return l *= r; }
  21.     friend constexpr mint operator / (mint l, const mint &r) { return l /= r; }
  22.     constexpr mint& operator += (const mint &r) {
  23.         v += r.v;
  24.         if (v >= mod) v -= mod;
  25.         return *this;
  26.     }
  27.     constexpr mint& operator -= (const mint &r) {
  28.         v -= r.v;
  29.         if (v < 0) v += mod;
  30.         return *this;
  31.     }
  32.     constexpr mint& operator *= (const mint &r) {
  33.         v = v * r.v % mod;
  34.         return *this;
  35.     }
  36.     constexpr mint& operator /= (const mint &r) {
  37.         return *this *= r.inv();
  38.     }
  39.     constexpr mint pow(long long n) const {
  40.         mint res(1), mul(*this);
  41.         while (n > 0) {
  42.             if (n & 1) res *= mul;
  43.             mul *= mul;
  44.             n >>= 1;
  45.         }
  46.         return res;
  47.     }
  48.     constexpr mint inv() const {
  49.         return pow(mod - 2);
  50.     }
  51.     constexpr int legendre() const {
  52.         int res = pow(mod >> 1).v;
  53.         return (res == mod - 1) ? -1 : res;
  54.     }
  55.  
  56.     // Square root (https://judge.yosupo.jp/submission/122087)
  57.     std::optional<mint> sqrt() const {
  58.         mint a(*this);
  59.         int m = mod;
  60.         if(a.v < 2) return a;
  61.         if(m % 2 == 0 || a.pow(m >> 1) == -1) return nullopt;
  62.         static mt19937 rnd(chrono::steady_clock::now().time_since_epoch().count());
  63.         mint t;
  64.         do t = rnd(); while((t*t - a*4).pow(m >> 1) != -1);
  65.         mint d = 1, c = -t, b = -t;
  66.         for (++m; m >>= 1; b = a*2 - b*b, a *= a) {
  67.             if (m % 2) d = c - d*b, c *= a;
  68.             else c = d*a - c*b;
  69.         }
  70.         if (2*d.v > mod) return -d;
  71.         return d;
  72.     }
  73.  
  74.     // @warning a must not contain a 0
  75.     friend vector<mint> invs(const vector<mint> &a) {
  76.         int n = a.size();
  77.         vector<mint> b(n+1);
  78.         b[0] = 1;
  79.         for (int i = 0; i < n; i++) b[i+1] = b[i] * a[i];
  80.         assert(b[n] != 0);
  81.         mint x = b[n].inv();
  82.         vector<mint> res(n);
  83.         for (int i = n-1; i >= 0; i--) {
  84.             res[i] = x * b[i];
  85.             x *= a[i];
  86.         }
  87.         return res;
  88.     }
  89.  
  90.     // combo
  91.     inline static vector<int> facts{1}, finvs{1};
  92.     friend mint fact(mint a) {
  93.         while (facts.size() <= a.v) {
  94.             facts.push_back((int64_t)facts.back() * facts.size() % mod);
  95.         }
  96.         return facts[a.v];
  97.     }
  98.     friend mint finv(mint a) {
  99.         while (finvs.size() <= a.v) finvs.push_back(fact((mint)finvs.size()).inv().v);
  100.         return finvs[a.v];
  101.     }
  102.     friend mint choose(mint n, mint k) {
  103.         return fact(n) * finv(k) * finv(n - k);
  104.     }
  105.     friend mint perm(mint n, mint k) {
  106.         return fact(n) * finv(n - k);
  107.     }
  108.     static void precomp_fact(int n) {
  109.         fact(mint(n));
  110.         int old = finvs.size();
  111.         if (old > n) return;
  112.         finvs.resize(n + 1);
  113.         finvs[n] = mint(facts[n]).inv().v;
  114.         for (int i = n; i >= old; i--)
  115.             finvs[i - 1] = (int64_t)finvs[i] * i % mod;
  116.     }
  117.  
  118.     // other operators
  119.     constexpr bool operator == (const mint &r) const {
  120.         return this->v == r.v;
  121.     }
  122.     constexpr bool operator != (const mint &r) const {
  123.         return this->v != r.v;
  124.     }
  125.     constexpr mint& operator ++ () {
  126.         ++v;
  127.         if (v >= mod) v -= mod;
  128.         return *this;
  129.     }
  130.     constexpr mint& operator -- () {
  131.         if (v == 0) v += mod;
  132.         --v;
  133.         return *this;
  134.     }
  135.     constexpr mint operator ++ (int) {
  136.         mint res = *this;
  137.         ++*this;
  138.         return res;
  139.     }
  140.     constexpr mint operator -- (int) {
  141.         mint res = *this;
  142.         --*this;
  143.         return res;
  144.     }
  145.     friend istream& operator >> (istream &is, mint &x) {
  146.         is >> x.v;
  147.         x.v %= mod;
  148.         if (x.v < 0) x.v += mod;
  149.         return is;
  150.     }
  151.     friend ostream& operator << (ostream &os, const mint &x) {
  152.         return os << x.v;
  153.     }
  154.     friend constexpr mint pow(const mint &r, long long n) {
  155.         return r.pow(n);
  156.     }
  157.     friend constexpr mint inv(const mint &r) {
  158.         return r.inv();
  159.     }
  160.     friend constexpr mint legendre(const mint &r) {
  161.         return r.legendre();
  162.     }
  163.     friend optional<mint> sqrt(const mint &r) {
  164.         return r.sqrt();
  165.     }
  166. };
Advertisement
Add Comment
Please, Sign In to add comment