QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#88661#5826. 错排Withery30 2086ms324212kbC++208.7kb2023-03-16 20:57:252023-03-28 12:38:47

Judging History

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

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2023-03-28 12:38:47]
  • 评测
  • 测评结果:30
  • 用时:2086ms
  • 内存:324212kb
  • [2023-03-16 20:57:25]
  • 提交

answer

#include <bits/stdc++.h>
using namespace std ;

template <typename T>
T inverse(T a, T m) {
  T u = 0, v = 1;
  while (a != 0) {
    T t = m / a;
    m -= t * a; swap(a, m);
    u -= t * v; swap(u, v);
  }
  assert(m == 1);
  return u;
}

template <typename T>
class Modular {
 public:
  using Type = typename decay<decltype(T::value)>::type;

  constexpr Modular() : value() {}
  template <typename U>
  Modular(const U& x) {
    value = normalize(x);
  }

  template <typename U>
  static Type normalize(const U& x) {
    Type v;
    if (-mod() <= x && x < mod()) v = static_cast<Type>(x);
    else v = static_cast<Type>(x % mod());
    if (v < 0) v += mod();
    return v;
  }

  const Type& operator()() const { return value; }
  template <typename U>
  explicit operator U() const { return static_cast<U>(value); }
  constexpr static Type mod() { return T::value; }

  Modular& operator+=(const Modular& other) { if ((value += other.value) >= mod()) value -= mod(); return *this; }
  Modular& operator-=(const Modular& other) { if ((value -= other.value) < 0) value += mod(); return *this; }
  template <typename U> Modular& operator+=(const U& other) { return *this += Modular(other); }
  template <typename U> Modular& operator-=(const U& other) { return *this -= Modular(other); }
  Modular& operator++() { return *this += 1; }
  Modular& operator--() { return *this -= 1; }
  Modular operator++(int) { Modular result(*this); *this += 1; return result; }
  Modular operator--(int) { Modular result(*this); *this -= 1; return result; }
  Modular operator-() const { return Modular(-value); }

  template <typename U = T>
  typename enable_if<is_same<typename Modular<U>::Type, int>::value, Modular>::type& operator*=(const Modular& rhs) {
#ifdef _WIN32
    uint64_t x = static_cast<int64_t>(value) * static_cast<int64_t>(rhs.value);
    uint32_t xh = static_cast<uint32_t>(x >> 32), xl = static_cast<uint32_t>(x), d, m;
    asm(
      "divl %4; \n\t"
      : "=a" (d), "=d" (m)
      : "d" (xh), "a" (xl), "r" (mod())
    );
    value = m;
#else
    value = normalize(static_cast<int64_t>(value) * static_cast<int64_t>(rhs.value));
#endif
    return *this;
  }
  template <typename U = T>
  typename enable_if<is_same<typename Modular<U>::Type, int64_t>::value, Modular>::type& operator*=(const Modular& rhs) {
    int64_t q = static_cast<int64_t>(static_cast<long double>(value) * rhs.value / mod());
    value = normalize(value * rhs.value - q * mod());
    return *this;
  }
  template <typename U = T>
  typename enable_if<!is_integral<typename Modular<U>::Type>::value, Modular>::type& operator*=(const Modular& rhs) {
    value = normalize(value * rhs.value);
    return *this;
  }

  Modular& operator/=(const Modular& other) { return *this *= Modular(inverse(other.value, mod())); }

  template <typename U>
  friend bool operator==(const Modular<U>& lhs, const Modular<U>& rhs);

  template <typename U>
  friend bool operator<(const Modular<U>& lhs, const Modular<U>& rhs);

  template <typename U>
  friend std::istream& operator>>(std::istream& stream, Modular<U>& number);

 private:
  Type value;
};

template <typename T> bool operator==(const Modular<T>& lhs, const Modular<T>& rhs) { return lhs.value == rhs.value; }
template <typename T, typename U> bool operator==(const Modular<T>& lhs, U rhs) { return lhs == Modular<T>(rhs); }
template <typename T, typename U> bool operator==(U lhs, const Modular<T>& rhs) { return Modular<T>(lhs) == rhs; }

template <typename T> bool operator!=(const Modular<T>& lhs, const Modular<T>& rhs) { return !(lhs == rhs); }
template <typename T, typename U> bool operator!=(const Modular<T>& lhs, U rhs) { return !(lhs == rhs); }
template <typename T, typename U> bool operator!=(U lhs, const Modular<T>& rhs) { return !(lhs == rhs); }

template <typename T> bool operator<(const Modular<T>& lhs, const Modular<T>& rhs) { return lhs.value < rhs.value; }

template <typename T> Modular<T> operator+(const Modular<T>& lhs, const Modular<T>& rhs) { return Modular<T>(lhs) += rhs; }
template <typename T, typename U> Modular<T> operator+(const Modular<T>& lhs, U rhs) { return Modular<T>(lhs) += rhs; }
template <typename T, typename U> Modular<T> operator+(U lhs, const Modular<T>& rhs) { return Modular<T>(lhs) += rhs; }

template <typename T> Modular<T> operator-(const Modular<T>& lhs, const Modular<T>& rhs) { return Modular<T>(lhs) -= rhs; }
template <typename T, typename U> Modular<T> operator-(const Modular<T>& lhs, U rhs) { return Modular<T>(lhs) -= rhs; }
template <typename T, typename U> Modular<T> operator-(U lhs, const Modular<T>& rhs) { return Modular<T>(lhs) -= rhs; }

template <typename T> Modular<T> operator*(const Modular<T>& lhs, const Modular<T>& rhs) { return Modular<T>(lhs) *= rhs; }
template <typename T, typename U> Modular<T> operator*(const Modular<T>& lhs, U rhs) { return Modular<T>(lhs) *= rhs; }
template <typename T, typename U> Modular<T> operator*(U lhs, const Modular<T>& rhs) { return Modular<T>(lhs) *= rhs; }

template <typename T> Modular<T> operator/(const Modular<T>& lhs, const Modular<T>& rhs) { return Modular<T>(lhs) /= rhs; }
template <typename T, typename U> Modular<T> operator/(const Modular<T>& lhs, U rhs) { return Modular<T>(lhs) /= rhs; }
template <typename T, typename U> Modular<T> operator/(U lhs, const Modular<T>& rhs) { return Modular<T>(lhs) /= rhs; }

template<typename T, typename U>
Modular<T> power(const Modular<T>& a, const U& b) {
  assert(b >= 0);
  Modular<T> x = a, res = 1;
  U p = b;
  while (p > 0) {
    if (p & 1) res *= x;
    x *= x;
    p >>= 1;
  }
  return res;
}

template <typename T>
string to_string(const Modular<T>& number) {
  return to_string(number());
}

template <typename T>
std::ostream& operator<<(std::ostream& stream, const Modular<T>& number) {
  return stream << number();
}

template <typename T>
std::istream& operator>>(std::istream& stream, Modular<T>& number) {
  typename common_type<typename Modular<T>::Type, int64_t>::type x;
  stream >> x;
  number.value = Modular<T>::normalize(x);
  return stream;
}

/*
using ModType = int;

struct VarMod { static ModType value; };
ModType VarMod::value;
ModType& md = VarMod::value;
using Mint = Modular<VarMod>;
*/

constexpr int md = 998244353 ;
using Mint = Modular<std::integral_constant<decay<decltype(md)>::type, md>>;

int step = 500 ;
Mint dp0[520][200010] ;
Mint dp1[520][200010] ;
Mint fac[200010] ;
Mint ddiv[200010] ;
Mint f[200010] ;

Mint dfs0( int n ,int m ){
  if( m < 0 ) return 0 ;
  if( m == 0 ) return 1 ;
  if( dp0[m/step][n] != 0 ) return dp0[m/step][n] ;
  if( n == m + 1 ) return f[n] + f[n-1] ;
  if( n == m ) return f[n] ;
//  return dp0[n/500][m] = dfs0(n,m-1) * (n-2*m+1) + dfs0(n,m-2)*(n-m+2)*(m-1) ;
  return dp0[m/step][n] = (dfs0(n-1,m)*(n+1) - dfs0(n-2,m)) * ddiv[n-m] ;
}
Mint dfs1( int n ,int m ){
  if( m < 0 ) return 0 ;
  if( m == 0 ) return 1 ;
  if( dp1[m/step][n] != 0 ) return dp1[m/step][n] ;
  if( n == m + 1 ) return f[n] + f[n-1] ;
  if( n == m ) return f[n] ;
  return dp1[m/step][n] = (dfs1(n-1,m)*(n+1) - dfs1(n-2,m)) * ddiv[n-m] ;
//  return dp1[n/500][m] = dfs1(n,m-1) * (n-2*m+1) + dfs1(n,m-2)*(n-m+2)*(m-1) ;
}



/*
Mint dfs1( int n ,int m ){
  if( m < 0 ) return 0 ;
  if( m == 0 ) return 1 ;
  if( tmp[n] != 0 ) return dp[n] ;
  if( n == m + 1 ) return f[n] + f[n-1] ;
  if( n == m ) return f[n] ;
  return tmp[n] = (dfs1(n-1,m)*(n+1) - dfs1(n-2,m)) / (n-m) ;
}*/

int main(){
  std::ios::sync_with_stdio(false);
  std::cin.tie(0);
  int n ,m ;
  fac[0] = 1 ;
  for( int i = 1 ;i <= 200000 ;i ++ )
    fac[i] = fac[i-1] * i ;
  for( int i = 2 ;i <= 200000 ;i ++ ) f[i] = f[i-1] * i + (i%2?-1:1) ;
  for( int i = 1 ;i <= 200000 ;i ++ ) ddiv[i] = Mint(1)/i ;
  for( int i = 0 ;i <= 200000 ;i += step ){
    for( int j = i ;j <= 200000 ;j ++ )
      dp0[i/step][j] = dfs0( j ,i ) ;

    for( int j = i+1 ;j <= 200000 ;j ++ )
      dp1[i/step][j] = dfs1( j ,i+1 ) ;
  }
  auto c = [&]( int a ,int b ){ return fac[a] / fac[b] / fac[a-b] ; } ;
  int T ;
  cin >> T ;
  while( T -- ){
    cin >> n >> m ;
    if( m * 2 > n ){
      cout << 0 << endl ;
      continue ;
    }
    Mint ans ,a0 ,a1 ;
    int s = (n-m-m)/step ;
    a0 = dp0[s][n-m] ;
    a1 = dp1[s][n-m] ;
    if( s * step == n - m - m ) ans = dp0[s][n-m] ;
    if( s * step + 1 == n - m - m ) ans = dp1[s][n-m] ;
    s = s*step+2 ;
    for( int i = s ;i <= n-m-m ;i ++ ){
      ans = a1 * ( n - m - 2 * i + 1 ) + a0 * ( n - m - i + 2 ) * ( i - 1 ) ;
      a0 = a1 ;
      a1 = ans ;
    }
    cout << ans * fac[m] * c(n-m,m) * fac[m] << endl ;
  }
//  cout << dfs( n-m ,n-m-m ) * fac[m] * c(n-m,m) * fac[m] << endl ;

}

Details

Tip: Click on the bar to expand more detailed information

Subtask #1:

score: 1
Accepted

Test #1:

score: 1
Accepted
time: 2076ms
memory: 323368kb

input:

0

output:


result:

ok 0 number(s): ""

Subtask #2:

score: 9
Accepted

Test #2:

score: 9
Accepted
time: 1948ms
memory: 323748kb

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: 1965ms
memory: 322556kb

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: 2018ms
memory: 323428kb

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: 1941ms
memory: 322392kb

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: 1918ms
memory: 323816kb

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
Time Limit Exceeded

Test #7:

score: 0
Time Limit Exceeded

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: 0
Time Limit Exceeded

Test #8:

score: 0
Time Limit Exceeded

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:


Subtask #5:

score: 20
Accepted

Dependency #1:

100%
Accepted

Dependency #2:

100%
Accepted

Test #13:

score: 20
Accepted
time: 1953ms
memory: 324212kb

input:

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

output:

139176963
393241499
258873190
39229362
870875380
975228452
243360193
751148936
95574458
297629235

result:

ok 10 numbers

Test #14:

score: 0
Accepted
time: 1973ms
memory: 323348kb

input:

10
158002 80444
9451 2903
173427 12416
137154 16538
166581 24311
127365 41216
190696 67064
103832 40293
108767 52320
109966 50541

output:

0
702735124
750025710
841222658
375040035
583566228
649803213
746573713
113561055
257165994

result:

ok 10 numbers

Test #15:

score: 0
Accepted
time: 2086ms
memory: 322804kb

input:

10
116222 34542
164940 69028
129899 24339
178863 5716
55643 22577
198734 88929
133306 14275
81416 35799
63999 8310
161489 76991

output:

290743004
378341801
539453217
748305238
182916741
547729744
354427924
684683519
325465086
252320707

result:

ok 10 numbers

Test #16:

score: 0
Accepted
time: 2066ms
memory: 322608kb

input:

10
195516 163316
189541 26309
135594 44847
135877 65724
130088 25449
43733 28
99690 16935
64787 30191
71441 7633
149688 65415

output:

0
913189292
577808221
197261625
42734325
96320751
700077354
534988269
607854165
915606441

result:

ok 10 numbers

Test #17:

score: 0
Accepted
time: 1906ms
memory: 323444kb

input:

10
163009 107578
44973 3654
143223 16359
94260 46849
30253 4092
157914 12798
96468 10458
69392 15738
175738 45794
88177 40742

output:

0
3532506
560207666
853291572
71222878
859859971
982136558
976170384
963781875
378642896

result:

ok 10 numbers

Test #18:

score: 0
Accepted
time: 1969ms
memory: 324104kb

input:

10
110588 39549
80716 17407
111961 32201
141172 69526
113156 9733
197619 33476
175704 25422
193136 84984
121758 34704
186415 47390

output:

365752740
457468561
833768060
154200192
143999958
497510358
149082994
737572231
779740562
243498597

result:

ok 10 numbers

Test #19:

score: 0
Accepted
time: 1983ms
memory: 323276kb

input:

10
135555 22650
164492 12323
142156 56953
147138 39540
198672 13148
113977 32999
140219 50353
70617 28677
163824 34306
189792 79678

output:

607236911
240877911
474627738
535731583
760041723
433248274
681491153
764919295
435671865
90602437

result:

ok 10 numbers

Test #20:

score: 0
Accepted
time: 1937ms
memory: 323844kb

input:

10
170490 75332
171298 50434
192270 14874
169646 26194
148215 47449
184554 54250
89981 14289
155225 40485
117440 37074
176617 25601

output:

674081939
124446215
364039988
511947341
952033804
203192142
723185949
644885639
266757734
667462943

result:

ok 10 numbers

Subtask #6:

score: 0
Skipped

Dependency #1:

100%
Accepted

Dependency #2:

100%
Accepted

Dependency #3:

0%