Guest User

Untitled

a guest
Jan 18th, 2025
173
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.39 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #ifdef LOCAL
  5. #include "../debug.h"
  6. #else
  7. #define dbg(...)
  8. #endif
  9.  
  10. namespace mint_ns {
  11. template<auto P>
  12. struct Modular {
  13.     using value_type = decltype(P);
  14.     value_type value;
  15.  
  16.     Modular(long long k = 0) : value(norm(k)) {}
  17.  
  18.     friend Modular<P>& operator += (      Modular<P>& n, const Modular<P>& m) { n.value += m.value; if (n.value >= P) n.value -= P; return n; }
  19.     friend Modular<P>  operator +  (const Modular<P>& n, const Modular<P>& m) { Modular<P> r = n; return r += m; }
  20.  
  21.     friend Modular<P>& operator -= (      Modular<P>& n, const Modular<P>& m) { n.value -= m.value; if (n.value < 0)  n.value += P; return n; }
  22.     friend Modular<P>  operator -  (const Modular<P>& n, const Modular<P>& m) { Modular<P> r = n; return r -= m; }
  23.     friend Modular<P>  operator -  (const Modular<P>& n)                      { return Modular<P>(-n.value); }
  24.  
  25.     friend Modular<P>& operator *= (      Modular<P>& n, const Modular<P>& m) { n.value = n.value * 1ll * m.value % P; return n; }
  26.     friend Modular<P>  operator *  (const Modular<P>& n, const Modular<P>& m) { Modular<P> r = n; return r *= m; }
  27.  
  28.     friend Modular<P>& operator /= (      Modular<P>& n, const Modular<P>& m) { return n *= m.inv(); }
  29.     friend Modular<P>  operator /  (const Modular<P>& n, const Modular<P>& m) { Modular<P> r = n; return r /= m; }
  30.  
  31.     Modular<P>& operator ++ (   ) { return *this += 1; }
  32.     Modular<P>& operator -- (   ) { return *this -= 1; }
  33.     Modular<P>  operator ++ (int) { Modular<P> r = *this; *this += 1; return r; }
  34.     Modular<P>  operator -- (int) { Modular<P> r = *this; *this -= 1; return r; }
  35.  
  36.     friend bool operator == (const Modular<P>& n, const Modular<P>& m) { return n.value == m.value; }
  37.     friend bool operator != (const Modular<P>& n, const Modular<P>& m) { return n.value != m.value; }
  38.  
  39.     explicit    operator       int() const { return value; }
  40.     explicit    operator      bool() const { return value; }
  41.     explicit    operator long long() const { return value; }
  42.  
  43.     constexpr static value_type mod()      { return     P; }
  44.  
  45.     value_type norm(long long k) {
  46.         if (!(-P <= k && k < P)) k %= P;
  47.         if (k < 0) k += P;
  48.         return k;
  49.     }
  50.  
  51.     Modular<P> inv() const {
  52.         value_type a = value, b = P, x = 0, y = 1;
  53.         while (a != 0) { value_type k = b / a; b -= k * a; x -= k * y; swap(a, b); swap(x, y); }
  54.         return Modular<P>(x);
  55.     }
  56.  
  57.     friend void __print(Modular<P> v) {
  58.         cerr << v.value;
  59.     }
  60. };
  61. template<auto P> Modular<P> pow(Modular<P> m, long long p) {
  62.     Modular<P> r(1);
  63.     while (p) {
  64.         if (p & 1) r *= m;
  65.         m *= m;
  66.         p >>= 1;
  67.     }
  68.     return r;
  69. }
  70.  
  71. template<auto P> ostream& operator << (ostream& o, const Modular<P>& m) { return o << m.value; }
  72. template<auto P> istream& operator >> (istream& i,       Modular<P>& m) { long long k; i >> k; m.value = m.norm(k); return i; }
  73. template<auto P> string   to_string(const Modular<P>& m) { return to_string(m.value); }
  74.  
  75. }
  76. constexpr int mod = 998244353;
  77. using mod_int = mint_ns::Modular<mod>;
  78.  
  79. struct Comb {
  80.     int n;
  81.     vector<mod_int> _fac, _invfac, _inv;
  82.     Comb() : n{0}, _fac{1}, _invfac{1}, _inv{0} {}
  83.     Comb(int n) : Comb() { init(n); }
  84.     void init(int m) {
  85.         m = min(m, mod - 1);
  86.         if (m <= n) return;
  87.         _fac.resize(m + 1); _invfac.resize(m + 1); _inv.resize(m + 1);
  88.         for (int i = n + 1; i <= m; i++) _fac[i] = _fac[i - 1] * i;
  89.         _invfac[m] = _fac[m].inv();
  90.         for (int i = m; i > n; i--) _invfac[i - 1] = _invfac[i] * i, _inv[i] = _invfac[i] * _fac[i - 1];
  91.         n = m;
  92.     }
  93.     mod_int fac(int m) { if (m > n) init(2 * m); return _fac[m]; }
  94.     mod_int invfac(int m) { if (m > n) init(2 * m); return _invfac[m]; }
  95.     mod_int inv(int m) { if (m > n) init(2 * m); return _inv[m]; }
  96.     mod_int ncr(int n, int r) { if (n < r || r < 0) return 0; return fac(n) * invfac(r) * invfac(n - r); }
  97.   mod_int place(int n, int r) { return ncr(n + r - 1, r - 1); } // stars and bars : x1 + x2 - - - xr = n
  98. } comb;
  99.  
  100.  
  101. const int root = 62;
  102. void ntt(vector<mod_int> &a) {
  103.   int n = (int)a.size(), L = 31 - __builtin_clz(n);
  104.   static vector<mod_int> rt(2, 1);
  105.   for (static int k = 2, s = 2; k < n; k *= 2, s++) {
  106.     rt.resize(n);
  107.     mod_int z[] = {1, pow(mod_int(root), mod >> s)};
  108.     for(int i = k ; i < 2 * k ; ++i)    rt[i] = rt[i / 2] * z[i & 1];
  109.   }
  110.   vector<int> rev(n);
  111.   for(int i = 0 ; i < n ; ++i)  rev[i] = (rev[i / 2] | (i & 1) << L) / 2;
  112.   for(int i  = 0 ; i < n ; ++i) if(i < rev[i])  swap(a[i], a[rev[i]]);
  113.  
  114.   for (int k = 1; k < n; k *= 2)
  115.     for (int i = 0; i < n; i += 2 * k) for(int j = 0 ; j < k ; ++j) {
  116.       mod_int z = rt[j + k] * a[i + j + k], &ai = a[i + j];
  117.       a[i + j + k] = ai - z;
  118.       ai += z;
  119.     }
  120. }
  121.  
  122. vector<mod_int> conv(const vector<mod_int> &a, const vector<mod_int> &b) {
  123.   if (a.empty() || b.empty()) return {};
  124.   int s = (int)a.size() + (int)b.size() - 1, B = 32 - __builtin_clz(s),
  125.       n = 1 << B;
  126.   mod_int inv = pow(mod_int(n), mod - 2);
  127.  
  128.   vector<mod_int> L(a), R(b), out(n);
  129.   L.resize(n), R.resize(n);
  130.   ntt(L), ntt(R);
  131.   for(int i = 0 ; i < n ; ++i)
  132.     out[-i & (n - 1)] = L[i] * R[i] * inv;
  133.   ntt(out);
  134.   return {out.begin(), out.begin() + s};
  135. }
  136.  
  137. int32_t main() {
  138.   ios_base::sync_with_stdio(0);
  139.   cin.tie(0);
  140.  
  141.   auto __solve_testcase = [&](int test) {
  142.     int N, M;  cin >> N >> M;
  143.  
  144.     int K = min(N, M);
  145.     vector<mod_int> P(K + 1), T(K + 1);
  146.     for(int i = 0 ; i <= K ; ++i) {
  147.       P[i] = pow(mod_int(M - 1 - i), K) * comb.invfac(i);
  148.       if(i & 1) P[i] *= -1;
  149.       T[i] = comb.invfac(i);
  150.     }
  151.  
  152.  
  153.     vector<mod_int> res = conv(P, T);
  154.     res.resize(K + 1);
  155.  
  156.     for(int i = 0 ; i <= K ; ++i)
  157.       res[i] *= comb.fac(i);
  158.    
  159.    
  160.     for(int i = M + 1 ; i <= N ; ++i) {
  161.       vector<mod_int> nres(i + 1);
  162.       mod_int pa = M;
  163.       for(int j = i ; j >= 0 ; --j) {
  164.         mod_int a = max(0, M - (i - j));
  165.         mod_int b = M - pa;
  166.         pa = a;
  167.         if(j < i)
  168.           nres[j] += b * res[j];
  169.         if(j)
  170.           nres[j] += a * res[j - 1];
  171.       }
  172.       swap(res, nres);
  173.     }
  174.  
  175.     mod_int ans = 0;
  176.     for(int i = 0 ; i <= N ; ++i)
  177.       ans += res[i] * i;
  178.  
  179.     cout << ans << '\n';
  180.   };
  181.  
  182.   int NumTest = 1;
  183.   cin >> NumTest;
  184.   for(int testno = 1; testno <= NumTest ; ++testno) {
  185.     __solve_testcase(testno);
  186.   }
  187.  
  188.   return 0;
  189. }
Advertisement
Add Comment
Please, Sign In to add comment