Advertisement
Guest User

Untitled

a guest
Jan 7th, 2024
132
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.97 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. template<const int &MOD>
  6. struct _m_int {
  7.     int val;
  8.  
  9.     _m_int(int64_t v = 0) {
  10.         if (v < 0) v = v % MOD + MOD;
  11.         if (v >= MOD) v %= MOD;
  12.         val = int(v);
  13.     }
  14.  
  15.     _m_int(uint64_t v) {
  16.         if (v >= MOD) v %= MOD;
  17.         val = int(v);
  18.     }
  19.  
  20.     _m_int(int v) : _m_int(int64_t(v)) {}
  21.     _m_int(unsigned v) : _m_int(uint64_t(v)) {}
  22.  
  23.     explicit operator int() const { return val; }
  24.     explicit operator unsigned() const { return val; }
  25.     explicit operator int64_t() const { return val; }
  26.     explicit operator uint64_t() const { return val; }
  27.     explicit operator double() const { return val; }
  28.     explicit operator long double() const { return val; }
  29.  
  30.     _m_int& operator+=(const _m_int &other) {
  31.         val -= MOD - other.val;
  32.         if (val < 0) val += MOD;
  33.         return *this;
  34.     }
  35.  
  36.     _m_int& operator-=(const _m_int &other) {
  37.         val -= other.val;
  38.         if (val < 0) val += MOD;
  39.         return *this;
  40.     }
  41.  
  42.     static unsigned fast_mod(uint64_t x, unsigned m = MOD) {
  43. #if !defined(_WIN32) || defined(_WIN64)
  44.         return unsigned(x % m);
  45. #endif
  46.         // Optimized mod for Codeforces 32-bit machines.
  47.         // x must be less than 2^32 * m for this to work, so that x / m fits in an unsigned 32-bit int.
  48.         unsigned x_high = unsigned(x >> 32), x_low = unsigned(x);
  49.         unsigned quot, rem;
  50.         asm("divl %4\n"
  51.             : "=a" (quot), "=d" (rem)
  52.             : "d" (x_high), "a" (x_low), "r" (m));
  53.         return rem;
  54.     }
  55.  
  56.     _m_int& operator*=(const _m_int &other) {
  57.         val = fast_mod(uint64_t(val) * other.val);
  58.         return *this;
  59.     }
  60.  
  61.     _m_int& operator/=(const _m_int &other) {
  62.         return *this *= other.inv();
  63.     }
  64.  
  65.     friend _m_int operator+(const _m_int &a, const _m_int &b) { return _m_int(a) += b; }
  66.     friend _m_int operator-(const _m_int &a, const _m_int &b) { return _m_int(a) -= b; }
  67.     friend _m_int operator*(const _m_int &a, const _m_int &b) { return _m_int(a) *= b; }
  68.     friend _m_int operator/(const _m_int &a, const _m_int &b) { return _m_int(a) /= b; }
  69.  
  70.     _m_int& operator++() {
  71.         val = val == MOD - 1 ? 0 : val + 1;
  72.         return *this;
  73.     }
  74.  
  75.     _m_int& operator--() {
  76.         val = val == 0 ? MOD - 1 : val - 1;
  77.         return *this;
  78.     }
  79.  
  80.     _m_int operator++(int) { _m_int before = *this; ++*this; return before; }
  81.     _m_int operator--(int) { _m_int before = *this; --*this; return before; }
  82.  
  83.     _m_int operator-() const {
  84.         return val == 0 ? 0 : MOD - val;
  85.     }
  86.  
  87.     friend bool operator==(const _m_int &a, const _m_int &b) { return a.val == b.val; }
  88.     friend bool operator!=(const _m_int &a, const _m_int &b) { return a.val != b.val; }
  89.     friend bool operator<(const _m_int &a, const _m_int &b) { return a.val < b.val; }
  90.     friend bool operator>(const _m_int &a, const _m_int &b) { return a.val > b.val; }
  91.     friend bool operator<=(const _m_int &a, const _m_int &b) { return a.val <= b.val; }
  92.     friend bool operator>=(const _m_int &a, const _m_int &b) { return a.val >= b.val; }
  93.  
  94.     static const int SAVE_INV = int(1e6) + 5;
  95.     static _m_int save_inv[SAVE_INV];
  96.  
  97.     static void prepare_inv() {
  98.         // Ensures that MOD is prime, which is necessary for the inverse algorithm below.
  99.         for (int64_t p = 2; p * p <= MOD; p += p % 2 + 1)
  100.             assert(MOD % p != 0);
  101.  
  102.         save_inv[0] = 0;
  103.         save_inv[1] = 1;
  104.  
  105.         for (int i = 2; i < SAVE_INV; i++)
  106.             save_inv[i] = save_inv[MOD % i] * (MOD - MOD / i);
  107.     }
  108.  
  109.     _m_int inv() const {
  110.         if (save_inv[1] == 0)
  111.             prepare_inv();
  112.  
  113.         if (val < SAVE_INV)
  114.             return save_inv[val];
  115.  
  116.         _m_int product = 1;
  117.         int v = val;
  118.  
  119.         while (v >= SAVE_INV) {
  120.             product *= MOD - MOD / v;
  121.             v = MOD % v;
  122.         }
  123.  
  124.         return product * save_inv[v];
  125.     }
  126.  
  127.     _m_int pow(int64_t p) const {
  128.         if (p < 0)
  129.             return inv().pow(-p);
  130.  
  131.         _m_int a = *this, result = 1;
  132.  
  133.         while (p > 0) {
  134.             if (p & 1)
  135.                 result *= a;
  136.  
  137.             p >>= 1;
  138.  
  139.             if (p > 0)
  140.                 a *= a;
  141.         }
  142.  
  143.         return result;
  144.     }
  145.  
  146.     friend ostream& operator<<(ostream &os, const _m_int &m) {
  147.         return os << m.val;
  148.     }
  149. };
  150.  
  151. template<const int &MOD> _m_int<MOD> _m_int<MOD>::save_inv[_m_int<MOD>::SAVE_INV];
  152.  
  153. extern const int MOD = 1e9 + 7;
  154. using mint = _m_int<MOD>;
  155.  
  156. void solve() {
  157.     int n;
  158.     cin >> n;
  159.     mint ans = 1;
  160.     for (int x = 1; x <= n; ) {
  161.         int cur = n / x;
  162.         int y = n / cur;
  163.         int len = y - x + 1;
  164.         ans *= mint(cur).pow(len);
  165.         x = y + 1;
  166.     }
  167.     cout << ans << '\n';
  168. }
  169.  
  170. int main() {
  171.     ios_base::sync_with_stdio(0);
  172.     cin.tie(0);
  173.    
  174.     int tc = 1;
  175.     cin >> tc;
  176.     for (int t = 1; t <= tc; t++) {
  177.         solve();
  178.     }
  179.    
  180.     return 0;
  181. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement