QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#189990#4922. 生活在对角线下hos_lyric#30 116ms106712kbC++148.3kb2023-09-28 04:31:232024-07-04 02:10:49

Judging History

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

  • [2024-07-04 02:10:49]
  • 评测
  • 测评结果:30
  • 用时:116ms
  • 内存:106712kb
  • [2023-09-28 04:31:23]
  • 提交

answer

#include <cassert>
#include <cmath>
#include <cstdint>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <bitset>
#include <complex>
#include <deque>
#include <functional>
#include <iostream>
#include <limits>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <sstream>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <utility>
#include <vector>

using namespace std;

using Int = long long;

template <class T1, class T2> ostream &operator<<(ostream &os, const pair<T1, T2> &a) { return os << "(" << a.first << ", " << a.second << ")"; };
template <class T> ostream &operator<<(ostream &os, const vector<T> &as) { const int sz = as.size(); os << "["; for (int i = 0; i < sz; ++i) { if (i >= 256) { os << ", ..."; break; } if (i > 0) { os << ", "; } os << as[i]; } return os << "]"; }
template <class T> void pv(T a, T b) { for (T i = a; i != b; ++i) cerr << *i << " "; cerr << endl; }
template <class T> bool chmin(T &t, const T &f) { if (t > f) { t = f; return true; } return false; }
template <class T> bool chmax(T &t, const T &f) { if (t < f) { t = f; return true; } return false; }
#define COLOR(s) ("\x1b[" s "m")

////////////////////////////////////////////////////////////////////////////////
template <unsigned M_> struct ModInt {
  static constexpr unsigned M = M_;
  unsigned x;
  constexpr ModInt() : x(0U) {}
  constexpr ModInt(unsigned x_) : x(x_ % M) {}
  constexpr ModInt(unsigned long long x_) : x(x_ % M) {}
  constexpr ModInt(int x_) : x(((x_ %= static_cast<int>(M)) < 0) ? (x_ + static_cast<int>(M)) : x_) {}
  constexpr ModInt(long long x_) : x(((x_ %= static_cast<long long>(M)) < 0) ? (x_ + static_cast<long long>(M)) : x_) {}
  ModInt &operator+=(const ModInt &a) { x = ((x += a.x) >= M) ? (x - M) : x; return *this; }
  ModInt &operator-=(const ModInt &a) { x = ((x -= a.x) >= M) ? (x + M) : x; return *this; }
  ModInt &operator*=(const ModInt &a) { x = (static_cast<unsigned long long>(x) * a.x) % M; return *this; }
  ModInt &operator/=(const ModInt &a) { return (*this *= a.inv()); }
  ModInt pow(long long e) const {
    if (e < 0) return inv().pow(-e);
    ModInt a = *this, b = 1U; for (; e; e >>= 1) { if (e & 1) b *= a; a *= a; } return b;
  }
  ModInt inv() const {
    unsigned a = M, b = x; int y = 0, z = 1;
    for (; b; ) { const unsigned q = a / b; const unsigned c = a - q * b; a = b; b = c; const int w = y - static_cast<int>(q) * z; y = z; z = w; }
    assert(a == 1U); return ModInt(y);
  }
  ModInt operator+() const { return *this; }
  ModInt operator-() const { ModInt a; a.x = x ? (M - x) : 0U; return a; }
  ModInt operator+(const ModInt &a) const { return (ModInt(*this) += a); }
  ModInt operator-(const ModInt &a) const { return (ModInt(*this) -= a); }
  ModInt operator*(const ModInt &a) const { return (ModInt(*this) *= a); }
  ModInt operator/(const ModInt &a) const { return (ModInt(*this) /= a); }
  template <class T> friend ModInt operator+(T a, const ModInt &b) { return (ModInt(a) += b); }
  template <class T> friend ModInt operator-(T a, const ModInt &b) { return (ModInt(a) -= b); }
  template <class T> friend ModInt operator*(T a, const ModInt &b) { return (ModInt(a) *= b); }
  template <class T> friend ModInt operator/(T a, const ModInt &b) { return (ModInt(a) /= b); }
  explicit operator bool() const { return x; }
  bool operator==(const ModInt &a) const { return (x == a.x); }
  bool operator!=(const ModInt &a) const { return (x != a.x); }
  friend std::ostream &operator<<(std::ostream &os, const ModInt &a) { return os << a.x; }
};
////////////////////////////////////////////////////////////////////////////////

constexpr unsigned MO = 998244353;
using Mint = ModInt<MO>;

constexpr int LIM_INV = 400'010;
Mint inv[LIM_INV], fac[LIM_INV], invFac[LIM_INV];

void prepare() {
  inv[1] = 1;
  for (int i = 2; i < LIM_INV; ++i) {
    inv[i] = -((Mint::M / i) * inv[Mint::M % i]);
  }
  fac[0] = invFac[0] = 1;
  for (int i = 1; i < LIM_INV; ++i) {
    fac[i] = fac[i - 1] * i;
    invFac[i] = invFac[i - 1] * inv[i];
  }
}
Mint binom(Int n, Int k) {
  if (n < 0) {
    if (k >= 0) {
      return ((k & 1) ? -1 : +1) * binom(-n + k - 1, k);
    } else if (n - k >= 0) {
      return (((n - k) & 1) ? -1 : +1) * binom(-k - 1, n - k);
    } else {
      return 0;
    }
  } else {
    if (0 <= k && k <= n) {
      assert(n < LIM_INV);
      return fac[n] * invFac[k] * invFac[n - k];
    } else {
      return 0;
    }
  }
}

Mint path(int dx, int dy) {
  return (dx >= 0 && dy >= 0) ? (fac[dx + dy] * invFac[dx] * invFac[dy]) : 0;
}


constexpr int MAX_T = 100'010;
constexpr int MAX_PQ = 10;

int T, C, P, Q, L;
int N[MAX_T], M[MAX_T];
Mint F[MAX_T][MAX_PQ];


namespace expr {
Mint dp[110][110][210];
void run(int n) {
  memset(dp, 0, sizeof(dp));
  dp[0][0][0] = 1;
  for (int x = 0; x <= n; ++x) for (int y = 0; y <= n; ++y) {
    if (y <= x) {
      for (int k = x + y + 1; k >= 1; --k) dp[x][y][k] = dp[x][y][k - 1];
      dp[x][y][0] = 0;
    }
    for (int k = 0; k <= x + y + 1; ++k) dp[x + 1][y][k] += dp[x][y][k];
    for (int k = 0; k <= x + y + 1; ++k) dp[x][y + 1][k] += dp[x][y][k];
  }
  for (int x = 0; x <= n; ++x) {
    Mint g = 0, h = 0;
    for (int k = 0; k <= x + x + 1; ++k) {
      g += dp[x][x][k] * k;
      h += dp[x][x][k] * (x + x + 1 - k);
    }
    cerr << x << ": " << g + h << " " << g << " " << h << "; "; pv(dp[x][x], dp[x][x] + (x + x + 1 + 1));
  }
}
}  // expr


namespace brute {
constexpr int SMALL = 1010;
Mint g[SMALL][SMALL];
Mint dp[MAX_PQ][SMALL][SMALL][2];
vector<Mint> run() {
  memset(dp, 0, sizeof(dp));
  for (int p = 0; p < P; ++p) for (int q = 0; q < Q; ++q) {
    const int id = p * Q + q;
    dp[id][0][0][0] = 1;
    for (int x = 0; x <= L; ++x) for (int y = 0; y <= L + C; ++y) {
      if (y <= x) {
        dp[id][x][y][1] += dp[id][x][y][0] * Mint(x).pow(p) * Mint(y).pow(q);
      }
      dp[id][x + 1][y][0] += dp[id][x][y][0];
      dp[id][x + 1][y][1] += dp[id][x][y][1];
      dp[id][x][y + 1][0] += dp[id][x][y][0];
      dp[id][x][y + 1][1] += dp[id][x][y][1];
    }
// cerr<<"p = "<<p<<", q = "<<q<<endl;
// for(int x=0;x<=L;++x){for(int y=0;y<=L+C;++y)cerr<<dp[id][x][y][0]<<","<<dp[id][x][y][1]<<" ";cerr<<endl;}
  }
  vector<Mint> ans(T, 0);
  for (int t = 0; t < T; ++t) {
    for (int p = 0; p < P; ++p) for (int q = 0; q < Q; ++q) {
      const int id = p * Q + q;
      ans[t] += F[t][id] * dp[id][N[t]][M[t]][1];
    }
  }
  return ans;
}
}  // brute


namespace sub3 {
vector<Mint> run() {
  vector<Mint> gs(L + 1, 0), hs(L + 1, 0);
  for (int n = 0; n <= L; ++n) {
    gs[n] = ((2 * n + 1) * path(n, n) + Mint(4).pow(n)) / 2;
    hs[n] = path(n, n) * (2 * n + 1) - gs[n];
  }
// cerr<<"gs = "<<gs<<endl;
// cerr<<"hs = "<<hs<<endl;
  vector<Mint> ans(T, 0);
  for (int t = 0; t < T; ++t) {
    if (N[t] <= M[t]) {
      Mint sum = 0;
      for (int x = 0; x < N[t]; ++x) {
        // (x, x) -> (x, x+1)
        sum += gs[x] * (path(N[t] - x, M[t] - (x+1)) - path(M[t] - x, N[t] - (x+1)));
      }
      sum += gs[N[t]];
      ans[t] += F[t][0] * sum;
    } else {
      Mint sum = 0;
      for (int y = 0; y < M[t]; ++y) {
        // (y, y) -> (y+1, y)
        sum += hs[y] * (path(N[t] - (y+1), M[t] - y) - path(M[t] - (y+1), N[t] - y));
      }
      sum += hs[M[t]];
      sum = path(N[t], M[t]) * (N[t] + M[t] + 1) - sum;
      ans[t] += F[t][0] * sum;
    }
  }
  return ans;
}
}  // sub3


int main() {
  prepare();
  
  expr::run(10);
  
  for (; ~scanf("%d%d%d%d%d", &T, &C, &P, &Q, &L); ) {
    ++P;
    ++Q;
    for (int t = 0; t < T; ++t) {
      scanf("%d%d", &N[t], &M[t]);
      assert(N[t] + C == M[t]);
      for (int p = 0; p < P; ++p) for (int q = 0; q < Q; ++q) {
        scanf("%u", &F[t][p * Q + q].x);
      }
    }
    
    vector<Mint> ans;
    if (P == 1 && Q == 1) {
      ans = sub3::run();
    } else {
      ans = brute::run();
    }
    for (int t = 0; t < T; ++t) {
      printf("%u\n", ans[t].x);
    }
#ifdef LOCAL
const auto brt=brute::run();
for(int t=0;t<T;++t)if(brt[t]!=ans[t]){
 cerr<<N[t]<<" "<<M[t]<<"; ";pv(F[t],F[t]+P*Q);
 cerr<<"brt = "<<brt<<endl;
 cerr<<"ans = "<<ans<<endl;
}
assert(brt==ans);
#endif
  }
  return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Subtask #1:

score: 1
Accepted

Test #1:

score: 1
Accepted
time: 38ms
memory: 102956kb

input:

1 -10 1 2 1000
825 815
107973512 400177523 812303207
164088430 603506669 337780072

output:

360076089

result:

ok 1 number(s): "360076089"

Test #2:

score: 0
Accepted
time: 35ms
memory: 102684kb

input:

1 424 1 4 576
130 554
926445673 393820912 634481616 292175028 733650737
100427548 899689095 876811717 849191704 696040532

output:

564712546

result:

ok 1 number(s): "564712546"

Test #3:

score: 0
Accepted
time: 40ms
memory: 102668kb

input:

1 -171 2 1 1000
805 634
250066876 719653007
284194184 531322789
491311782 185842441

output:

910556244

result:

ok 1 number(s): "910556244"

Test #4:

score: 0
Accepted
time: 62ms
memory: 102668kb

input:

1 11 4 1 989
142 153
581558550 138798754
575233123 788754497
582314564 303591688
635874631 658261955
615116681 498307457

output:

918405181

result:

ok 1 number(s): "918405181"

Test #5:

score: 0
Accepted
time: 37ms
memory: 102772kb

input:

1 -87 1 2 1000
164 77
264180617 338145439 610918500
800846696 216126209 112962819

output:

629819261

result:

ok 1 number(s): "629819261"

Subtask #2:

score: 9
Accepted

Dependency #1:

100%
Accepted

Test #6:

score: 9
Accepted
time: 103ms
memory: 104692kb

input:

100000 -99 2 1 1000
712 613
238230707 820405654
473765646 826816733
751513618 421153458
209 110
22075351 398854663
148159396 487281124
972932017 200517786
383 284
22252771 205525630
491328752 607545155
561318911 135661425
929 830
156478040 89922795
380802607 32081978
898588032 110586958
956 857
4206...

output:

863094157
570366074
281608243
247495628
396961441
855444791
694374848
782506902
280202079
688077364
610676536
115373962
360154110
834242083
887647721
164293717
759683961
710870451
213441970
863772654
514218158
532711794
558875294
421795761
517787006
458381459
506983637
742686106
435175768
111255264
...

result:

ok 100000 numbers

Test #7:

score: 0
Accepted
time: 116ms
memory: 106712kb

input:

100000 252 3 1 748
130 382
311369319 709099006
49474431 724072531
761415026 251406187
389170658 169808960
581 833
89779535 938252574
504798466 677842435
654289171 763708659
719082912 762770851
691 943
571693157 187035992
300995260 403041189
726726538 63983502
814000657 315732021
121 373
339102104 42...

output:

516270157
614211606
655396807
981733406
752565578
312973289
850750616
826813023
753739511
227580123
199177890
403714939
559334967
370464926
363937285
583678656
239132195
834163477
111915553
68813179
875627540
299872127
660063389
31474925
464946255
125818391
645016505
267670615
440441568
356463850
84...

result:

ok 100000 numbers

Test #8:

score: 0
Accepted
time: 115ms
memory: 104720kb

input:

100000 195 2 2 805
325 520
266481322 663615421 428019284
968378746 158386978 211891009
161987045 142931644 790431809
621 816
756898302 952132541 196745128
424307295 926376261 130425563
604844618 645296808 252920984
60 255
873310227 887037637 787608776
98214115 355810775 242821836
537250851 650821017...

output:

922269244
757786754
400099571
332972619
780501723
469958234
540206804
924583388
519189002
566620024
244468115
73221163
663221021
159111716
451144022
658783977
656844692
831466434
186871631
60740257
542611012
773315130
755261907
193772041
628947709
363111530
452621670
349808610
264947076
342250907
16...

result:

ok 100000 numbers

Subtask #3:

score: 20
Accepted

Test #9:

score: 20
Accepted
time: 11ms
memory: 21632kb

input:

1 4683 0 0 95317
86560 91243
412303217

output:

952052072

result:

ok 1 number(s): "952052072"

Test #10:

score: 0
Accepted
time: 11ms
memory: 23156kb

input:

1 -24796 0 0 100000
93338 68542
849332154

output:

980840409

result:

ok 1 number(s): "980840409"

Test #11:

score: 0
Accepted
time: 4ms
memory: 21232kb

input:

1 40156 0 0 59844
39551 79707
566086447

output:

620552907

result:

ok 1 number(s): "620552907"

Test #12:

score: 0
Accepted
time: 12ms
memory: 23032kb

input:

1 -714 0 0 100000
72672 71958
817542139

output:

799272798

result:

ok 1 number(s): "799272798"

Test #13:

score: 0
Accepted
time: 3ms
memory: 22696kb

input:

1 23418 0 0 76582
6862 30280
442920403

output:

642352133

result:

ok 1 number(s): "642352133"

Test #14:

score: 0
Accepted
time: 4ms
memory: 22140kb

input:

1 42983 0 0 57017
42753 85736
380012689

output:

828068267

result:

ok 1 number(s): "828068267"

Test #15:

score: 0
Accepted
time: 15ms
memory: 22460kb

input:

1 -25448 0 0 100000
47466 22018
617788426

output:

485886943

result:

ok 1 number(s): "485886943"

Test #16:

score: 0
Accepted
time: 11ms
memory: 22240kb

input:

1 -35138 0 0 100000
49912 14774
472000456

output:

323681794

result:

ok 1 number(s): "323681794"

Test #17:

score: 0
Accepted
time: 9ms
memory: 23140kb

input:

1 15928 0 0 84072
57657 73585
31014982

output:

184096139

result:

ok 1 number(s): "184096139"

Test #18:

score: 0
Accepted
time: 7ms
memory: 21984kb

input:

1 5316 0 0 94684
36186 41502
601085246

output:

51887433

result:

ok 1 number(s): "51887433"

Subtask #4:

score: 0
Time Limit Exceeded

Dependency #3:

100%
Accepted

Test #19:

score: 0
Time Limit Exceeded

input:

100000 43925 0 0 56075
36770 80695
880793638
55133 99058
946571985
27169 71094
601132030
42027 85952
954509221
1261 45186
326012305
12030 55955
997023025
9914 53839
788665071
39921 83846
193760311
25774 69699
584278712
28428 72353
45133606
32564 76489
40466335
35483 79408
491164633
1587 45512
842380...

output:


result:


Subtask #5:

score: 0
Time Limit Exceeded

Dependency #1:

100%
Accepted

Dependency #3:

100%
Accepted

Test #26:

score: 0
Time Limit Exceeded

input:

1 -40679 1 3 100000
75191 34512
321693501 896183087 224533692 282076683
38691763 630172019 273852722 127891101

output:


result:


Subtask #6:

score: 0
Time Limit Exceeded

Test #41:

score: 0
Time Limit Exceeded

input:

100000 0 2 1 100000
48964 48964
666670967 90494987
74847122 615108201
29533064 582540229
14418 14418
391779909 223696706
701170191 885097597
551643398 25626747
81584 81584
951326734 520293397
13860946 896899117
821166399 282263457
76849 76849
598606953 879771697
930252135 671750715
673503431 3060699...

output:


result:


Subtask #7:

score: 0
Skipped

Dependency #1:

100%
Accepted

Dependency #2:

100%
Accepted

Dependency #3:

100%
Accepted

Dependency #4:

0%