QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#300378#5826. 错排Xiaohuba30 88ms112916kbC++238.5kb2024-01-08 09:31:542024-01-08 09:31:55

Judging History

你现在查看的是最新测评结果

  • [2024-01-08 09:31:55]
  • 评测
  • 测评结果:30
  • 用时:88ms
  • 内存:112916kb
  • [2024-01-08 09:31:54]
  • 提交

answer

// clang-format off
#include <bits/stdc++.h>

using namespace std;

#if __cplusplus < 201400
  #warning "Please use c++14 or higher."
  #define INLINE_V
  #define REGISTER_V register
  #define CPP14CONSTEXPR
  #define gcd __gcd
  #define CPP14ENABLE_IF
#elif __cplusplus < 201700
  #define INLINE_V
  #define REGISTER_V
  #define CPP14CONSTEXPR constexpr
  #define gcd __gcd
  #define CPP14ENABLE_IF ,enable_if_t<_is_integer<T>, int> = 0
#else
  #define INLINE_V inline
  #define REGISTER_V
  #define CPP14CONSTEXPR constexpr
  #define CPP14ENABLE_IF ,enable_if_t<_is_integer<T>, int> = 0
#endif

#if !defined(_WIN32) && !defined(LOCK_GETCHAR)
  #define getchar getchar_unlocked
#endif

#define il inline
#define mkp make_pair
#define fi first
#define se second
#define For(i,j,k) for(REGISTER_V int i=(j);i<=(k);++i) // NOLINT
#define ForDown(i,j,k) for(REGISTER_V int i=(j);i>=(k);--i) // NOLINT
#define pb push_back
#define eb emplace_back
#ifndef ONLINE_JUDGE
#define FileIO(filename) freopen(filename".in","r",stdin);freopen(filename".out","w",stdout)
#else
#define FileIO(filename)
#endif

using ll = long long;
// using lll = __int128_t;
using uint = unsigned int;
using ull = unsigned long long;
// using ulll = __uint128_t;
using db = double;
using ldb = long double;
using pii = pair<int, int>;
using pll = pair<ll, ll>;

#if __cplusplus >= 201400
  template <class T> INLINE_V constexpr bool _is_integer = numeric_limits<T>::is_integer;
  // template <> INLINE_V constexpr bool _is_integer<__int128> = true;
  // template <> INLINE_V constexpr bool _is_integer<__uint128_t> = true;
  template <> INLINE_V constexpr bool _is_integer<bool> = false;
  template <> INLINE_V constexpr bool _is_integer<char> = false;
  template <class T CPP14ENABLE_IF>
    INLINE_V constexpr T INF = numeric_limits<T>::max() >> 1;
#endif

template<typename T> constexpr il T sq(const T & x){return x*x;}
template<typename T> CPP14CONSTEXPR il void cmin(T & x, const T &y){x=min(x,y);}
template<typename T> CPP14CONSTEXPR il void cmax(T & x, const T &y){x=max(x,y);}
template<typename T> CPP14CONSTEXPR il T qpow(T x, ull y, T mod){T ans=1;x%=mod;while(y){if(y&1)(ans*=x)%=mod;(x*=x)%=mod;y>>=1;}return ans;}
template<typename T> CPP14CONSTEXPR il T qpow(T x, ull y){T ans=1;while(y){if(y&1)ans*=x;x*=x;y>>=1;}return ans;}
template<typename T CPP14ENABLE_IF> il void read(T &x){ x=0;int f=1;int c=getchar();while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}while(isdigit(c)){x=x*10+c-'0';c=getchar();}x*=f;}
template<typename T, typename ... Args> il void read(T &x, Args &... y){ read(x);read(y...); }

// File head end
// clang-format on

namespace Modint {
template <const uint Mod> class Modint {
  uint _val;
  il static unordered_map<uint, uint> _inv;

public:
  Modint() : _val(0) {}
  constexpr Modint(ll val) : _val((val % Mod + Mod) % Mod) {}
  [[nodiscard]] il uint value() const { return _val; }
  [[nodiscard]] il uint safe_value() const { return (_val + Mod) % Mod; }
  [[nodiscard]] il uint inv() const {
    return _inv.count(_val) ? _inv[_val]
                            : _inv[_val] = qpow(*this, Mod - 2)._val;
  }
  Modint operator-() const { return (Mod - this->safe_value()) % Mod; }
  void operator*=(const Modint &rhs) { _val = ((ull)_val * rhs._val) % Mod; }
  void operator/=(const Modint &rhs) { _val = ((ull)_val * rhs.inv()) % Mod; }
  void operator+=(const Modint &rhs) {
    int(_val += rhs._val - (Mod << 1)) < 0 ? _val += (Mod << 1) : (ull){};
  }
  void operator-=(const Modint &rhs) {
    int(_val -= rhs._val) < 0 ? _val += (Mod << 1) : (ull){};
  }
#define setOper(x)                                                             \
  [[nodiscard]] Modint operator x(const Modint &rhs) const {                   \
    auto lhs = *this;                                                          \
    lhs x## = rhs;                                                             \
    return lhs;                                                                \
  }
  setOper(+) setOper(-) setOper(*) setOper(/)
#undef setOper
};
template <const ll Mod> istream &operator>>(istream &istr, Modint<Mod> &x) {
  ll _temp;
  istr >> _temp, x = _temp;
  return istr;
}
template <const ll Mod> ostream &operator<<(ostream &ostr, Modint<Mod> x) {
  ostr << x.value();
  return ostr;
}
} // namespace Modint

using Z = Modint::Modint<998244353>;
constexpr Z operator""_Z(ull x);

class Poly : public vector<Z> {
  il static constexpr Z G = 3;
  il static constexpr uint MAXN = 1u << 21;

  il static vector<uint> _Rev;
  il static uint cur_len = 0;
  il static bool gn_table_ok = 0;
  il static Z GN[MAXN];
  il static void init_rev(uint len) {
    cur_len = len;
    _Rev.resize(len);
    For(i, 0, len - 1) {
      _Rev[i] = _Rev[i >> 1] >> 1;
      if (i & 1)
        _Rev[i] |= len >> 1;
    }
  }
  il static void init_gn_table() {
    GN[21] = qpow(G, 998244352 / (1 << 21));
    for (uint l = MAXN >> 1, i = 20; l >= 2; l >>= 1, i--) {
      GN[i] = sq(GN[i + 1]);
    }
    gn_table_ok = 1;
  }

  il void NTT(uint len, bool tp, Poly &res) const {
    res = *this;
    res.resize(len);
    if (len != cur_len)
      init_rev(len);
    if (!gn_table_ok)
      init_gn_table();
    for (uint i = 0; i < len; i++)
      if (i < _Rev[i])
        ::swap(res[i], res[_Rev[i]]);
    for (uint l = 2, lg = 1; l <= len; l <<= 1, lg++) {
      uint m = l >> 1;
      Z gn = GN[lg];
      for (uint i = 0; i < len; i += l) {
        Z g = 1;
        for (uint j = 0; j < m; j++, g *= gn) {
          Z tmp = res[i + j + m] * g;
          res[i + j + m] = res[i + j] - tmp;
          res[i + j] += tmp;
        }
      }
    }
    if (!tp) {
      reverse(res.begin() + 1, res.begin() + len);
      auto inv = Z(len).inv();
      For(i, 0, len - 1) res[i] *= inv;
    }
  }

public:
  Poly() = default;
  Poly(int sz) { this->clear(), this->resize(sz); }
  void operator+=(const Poly &rhs) {
    int n_sz = max(this->size(), rhs.size()), rhs_sz = rhs.size(); // NOLINT
    this->resize(n_sz);
    For(i, 0, rhs_sz - 1) this->operator[](i) += rhs[i];
  }
  void operator-=(const Poly &rhs) {
    int n_sz = max(this->size(), rhs.size()), rhs_sz = rhs.size(); // NOLINT
    this->resize(n_sz);
    For(i, 0, rhs_sz - 1) operator[](i) -= rhs[i];
  }
  void operator*=(const Poly &rhs) {
    int N = 1, NN = this->size() + rhs.size() - 1; // NOLINT
    while (N < NN)
      N <<= 1;
    Poly x, y, ans{N};
    this->NTT(N, 1, x), rhs.NTT(N, 1, y);
    For(i, 0, N - 1) ans[i] = x[i] * y[i];
    ans.NTT(N, 0, *this);
    resize(NN);
  }
#define setOper(x)                                                             \
  [[nodiscard]] Poly operator x(const Poly &rhs) const {                       \
    auto lhs = *this;                                                          \
    lhs x## = rhs;                                                             \
    return lhs;                                                                \
  }
  setOper(+) setOper(-) setOper(*)
#undef setOper
};

namespace {
constexpr ll MAXN = 2e5 + 5;
int T, n, m, B;
Z f[MAXN], finv[MAXN], D[MAXN], ans[MAXN];
struct Qry {
  int l, r, id;
  Qry() = default;
  Qry(int _l, int _r, int _id) : l(_l), r(_r), id(_id) {}
  bool operator<(const Qry &rhs) const {
    return (l / B) != (rhs.l / B) ? l < rhs.l : r < rhs.r;
  }
};
vector<Qry> qry;
il Z C(ll x, ll y) {
  if (x < 0 || y < 0 || x < y)
    return 0;
  return f[x] * finv[y] * finv[x - y];
}
il Z A(ll x, ll y) {
  if (x < 0 || y < 0 || x < y)
    return 0;
  return f[x] * finv[x - y];
}

// f(x, y + 1) = f(x, y) + f(x - 1, y)
// f(x + 1, y) = xf(x, y) + (x - y)f(x - 1, y)
Z val[5005][5005];

il void solver_main() {
  n = MAXN - 5, f[0] = 1;
  For(i, 1, n) f[i] = f[i - 1] * i;
  finv[n] = f[n].inv();
  ForDown(i, n, 1) finv[i - 1] = finv[i] * i;
  D[0] = 1;
  For(i, 2, n) D[i] = (D[i - 1] + D[i - 2]) * (i - 1);
  val[0][0] = 1;
  For(i, 1, 5000) {
    val[i][0] = D[i];
    For(j, 1, i) { val[i][j] = val[i][j - 1] + val[i - 1][j - 1]; }
  }

  read(T);
  For(i, 1, T) {
    int n, m;
    read(n, m);
    cout << (val[n - m][m] * A(n - m, m)).safe_value() << '\n';
    // if (m * 2 > n) {
    //   ans[i] = 0;
    //   continue;
    // }
    // qry.emplace_back(n - m, m, i);
  }

  // sort(qry.begin(), qry.end());
  // int l = 1, r = 0;
  // Z X{}, Y{};
  // for (auto q : qry) {
  // }
}
} // namespace

signed main() { return solver_main(), 0; }

詳細信息

Subtask #1:

score: 1
Accepted

Test #1:

score: 1
Accepted
time: 51ms
memory: 112716kb

input:

0

output:


result:

ok 0 number(s): ""

Subtask #2:

score: 9
Accepted

Test #2:

score: 9
Accepted
time: 49ms
memory: 112708kb

input:

10
8 6
5 1
4 2
6 3
8 1
3 1
6 2
3 1
4 1
6 2

output:

0
44
4
36
14833
2
168
2
9
168

result:

ok 10 numbers

Test #3:

score: 0
Accepted
time: 49ms
memory: 112884kb

input:

10
8 1
8 4
6 3
8 2
8 3
6 3
6 1
7 3
2 1
8 3

output:

14833
576
36
10860
4680
36
265
432
1
4680

result:

ok 10 numbers

Test #4:

score: 0
Accepted
time: 46ms
memory: 112732kb

input:

10
7 5
3 1
8 3
7 3
8 1
4 1
5 2
6 3
7 1
7 3

output:

0
2
4680
432
14833
9
24
36
1854
432

result:

ok 10 numbers

Test #5:

score: 0
Accepted
time: 44ms
memory: 112732kb

input:

10
7 2
8 4
6 1
5 1
8 2
6 3
4 2
8 3
3 1
8 1

output:

1280
576
265
44
10860
36
4
4680
2
14833

result:

ok 10 numbers

Test #6:

score: 0
Accepted
time: 46ms
memory: 112628kb

input:

10
6 6
3 1
8 3
2 1
7 1
3 1
6 2
8 4
7 3
7 0

output:

0
2
4680
1
1854
2
168
576
432
1854

result:

ok 10 numbers

Subtask #3:

score: 0
Runtime Error

Test #7:

score: 0
Runtime Error

input:

200000
1 0
2 0
3 0
4 0
5 0
6 0
7 0
8 0
9 0
10 0
11 0
12 0
13 0
14 0
15 0
16 0
17 0
18 0
19 0
20 0
21 0
22 0
23 0
24 0
25 0
26 0
27 0
28 0
29 0
30 0
31 0
32 0
33 0
34 0
35 0
36 0
37 0
38 0
39 0
40 0
41 0
42 0
43 0
44 0
45 0
46 0
47 0
48 0
49 0
50 0
51 0
52 0
53 0
54 0
55 0
56 0
57 0
58 0
59 0
60 0
61...

output:

0
1
2
9
44
265
1854
14833
133496
1334961
14684570
176214841
294304226
127281753
910981941
600290115
222488424
11814221
224470198
496426549
442513998
751108780
305347938
340640042
530046225
804025262
745550660
910531421
451058030
554564312
221339670
95158970
145512950
954462889
464137465
737039093
31...

result:


Subtask #4:

score: 20
Accepted

Test #8:

score: 20
Accepted
time: 74ms
memory: 112908kb

input:

200000
4303 1473
1276 72
967 234
3619 984
1316 384
2679 50
4426 1744
3782 1179
4919 4
805 63
3933 158
1574 528
1277 435
3826 915
2739 68
2286 349
3017 527
3036 476
4280 1764
1504 686
4584 917
1379 145
4764 2178
1881 45
4808 1565
3663 165
4730 2209
2258 103
4181 1687
1636 770
4339 1173
2355 777
3201 ...

output:

855518783
202627962
284771116
596280162
111952425
28114068
922980998
483503998
478475869
42227903
210453242
82826277
349706660
478397018
588903665
672339856
911511930
783922264
224272260
199537336
659467844
383745708
953695418
668329703
880293299
649430530
916687905
550953325
295023552
141584429
871...

result:

ok 200000 numbers

Test #9:

score: 0
Accepted
time: 83ms
memory: 112916kb

input:

200000
4558 644
2015 866
4752 1612
4343 704
4455 1277
4761 1069
1173 434
2150 1002
3226 132
4556 1468
4362 2008
3194 936
4750 1712
4133 58
4670 2111
3787 1705
1006 458
4973 1489
2520 934
3971 1256
4130 522
1648 28
4843 1800
3535 1031
2363 345
2722 1187
4620 1677
3738 325
3783 447
2026 617
4992 1595
...

output:

878092359
137664342
571257477
157127504
385052631
35779181
650061801
617898174
375209372
721222702
707783783
410748088
991469920
69775359
76681433
134815341
199607624
126498594
149881281
563970794
786560573
94902562
668383803
802669973
229778708
749799553
295203934
163664840
140841030
547218181
2572...

result:

ok 200000 numbers

Test #10:

score: 0
Accepted
time: 72ms
memory: 112708kb

input:

200000
4763 4669
4281 319
1441 342
1078 224
2092 1022
1666 78
2623 660
4797 1258
4878 1616
3255 931
619 85
3632 220
3163 1358
4177 1838
3072 746
938 59
4038 1283
3825 618
4889 1090
3988 1380
686 237
4488 139
3189 572
4790 263
2862 340
3325 261
2351 1141
3047 659
2562 445
4947 1894
2504 717
3399 1176...

output:

0
283193141
728175842
611328334
18202018
506844457
979367956
585351167
337548843
72363572
243634086
313739474
707317304
637199005
278105669
961177961
957750794
767835509
349772711
198594249
245831996
37104891
398916514
263271106
843118755
308147020
690301962
174120745
179202564
216399429
946430481
7...

result:

ok 200000 numbers

Test #11:

score: 0
Accepted
time: 88ms
memory: 112652kb

input:

200000
1079 17
495 169
2890 659
3047 174
3199 761
2190 375
1947 159
4965 614
4463 1910
3630 321
4253 574
3175 871
2697 1262
3957 455
3435 205
2640 4
2181 935
1712 162
1152 351
3230 288
3887 1633
1094 374
833 295
3987 1856
844 179
2218 178
4922 683
4637 1988
2952 384
1493 720
4479 239
3366 1065
3663 ...

output:

158255419
402786997
811229485
767930818
68320941
852585187
491766976
228169531
315305063
656254912
979729105
514370258
749323558
931029769
871820770
342080940
688359960
983900818
13404663
552784020
781611444
697598838
340229841
78829168
776783084
20633291
315417596
788999254
586658522
557773549
5532...

result:

ok 200000 numbers

Test #12:

score: 0
Accepted
time: 71ms
memory: 112724kb

input:

200000
2864 223
4155 1498
2880 894
3933 1830
4207 973
2290 684
3522 1032
3713 910
4110 1341
4991 1550
4116 695
2484 943
2630 243
4943 418
1912 812
4457 2146
4979 678
1731 834
2555 625
3686 310
299 45
396 170
2876 997
4163 1859
4463 985
1617 450
4895 2328
2672 1177
3513 262
3843 1901
3070 1484
4954 1...

output:

629916892
381928609
997446852
27448639
502566091
127425081
674803798
840491154
578725589
88000079
914879351
221195824
389963150
790633997
798572067
76424829
35810515
100952206
612109651
277816564
59895360
717456537
370024748
46166162
89317834
803273270
844790653
676215132
402126887
644239704
5667377...

result:

ok 200000 numbers

Subtask #5:

score: 0
Runtime Error

Dependency #1:

100%
Accepted

Dependency #2:

100%
Accepted

Test #13:

score: 0
Runtime Error

input:

10
94764 1149
111140 21372
59140 20928
73376 27175
59837 4344
160865 25705
44518 10326
145794 64106
147628 12887
103719 39458

output:


result:


Subtask #6:

score: 0
Skipped

Dependency #1:

100%
Accepted

Dependency #2:

100%
Accepted

Dependency #3:

0%