QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#243330#7761. 物理实验hos_lyric#50 1148ms16332kbC++1411.5kb2023-11-08 03:30:112024-07-04 02:23:09

Judging History

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

  • [2024-07-04 02:23:09]
  • 评测
  • 测评结果:50
  • 用时:1148ms
  • 内存:16332kb
  • [2023-11-08 03:30:11]
  • 提交

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 <random>
#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 = 998244353U;
constexpr unsigned MO2 = 2U * MO;
constexpr int FFT_MAX = 23;
using Mint = ModInt<MO>;
constexpr Mint FFT_ROOTS[FFT_MAX + 1] = {1U, 998244352U, 911660635U, 372528824U, 929031873U, 452798380U, 922799308U, 781712469U, 476477967U, 166035806U, 258648936U, 584193783U, 63912897U, 350007156U, 666702199U, 968855178U, 629671588U, 24514907U, 996173970U, 363395222U, 565042129U, 733596141U, 267099868U, 15311432U};
constexpr Mint INV_FFT_ROOTS[FFT_MAX + 1] = {1U, 998244352U, 86583718U, 509520358U, 337190230U, 87557064U, 609441965U, 135236158U, 304459705U, 685443576U, 381598368U, 335559352U, 129292727U, 358024708U, 814576206U, 708402881U, 283043518U, 3707709U, 121392023U, 704923114U, 950391366U, 428961804U, 382752275U, 469870224U};
constexpr Mint FFT_RATIOS[FFT_MAX] = {911660635U, 509520358U, 369330050U, 332049552U, 983190778U, 123842337U, 238493703U, 975955924U, 603855026U, 856644456U, 131300601U, 842657263U, 730768835U, 942482514U, 806263778U, 151565301U, 510815449U, 503497456U, 743006876U, 741047443U, 56250497U, 867605899U};
constexpr Mint INV_FFT_RATIOS[FFT_MAX] = {86583718U, 372528824U, 373294451U, 645684063U, 112220581U, 692852209U, 155456985U, 797128860U, 90816748U, 860285882U, 927414960U, 354738543U, 109331171U, 293255632U, 535113200U, 308540755U, 121186627U, 608385704U, 438932459U, 359477183U, 824071951U, 103369235U};

// as[rev(i)] <- \sum_j \zeta^(ij) as[j]
void fft(Mint *as, int n) {
  assert(!(n & (n - 1))); assert(1 <= n); assert(n <= 1 << FFT_MAX);
  int m = n;
  if (m >>= 1) {
    for (int i = 0; i < m; ++i) {
      const unsigned x = as[i + m].x;  // < MO
      as[i + m].x = as[i].x + MO - x;  // < 2 MO
      as[i].x += x;  // < 2 MO
    }
  }
  if (m >>= 1) {
    Mint prod = 1U;
    for (int h = 0, i0 = 0; i0 < n; i0 += (m << 1)) {
      for (int i = i0; i < i0 + m; ++i) {
        const unsigned x = (prod * as[i + m]).x;  // < MO
        as[i + m].x = as[i].x + MO - x;  // < 3 MO
        as[i].x += x;  // < 3 MO
      }
      prod *= FFT_RATIOS[__builtin_ctz(++h)];
    }
  }
  for (; m; ) {
    if (m >>= 1) {
      Mint prod = 1U;
      for (int h = 0, i0 = 0; i0 < n; i0 += (m << 1)) {
        for (int i = i0; i < i0 + m; ++i) {
          const unsigned x = (prod * as[i + m]).x;  // < MO
          as[i + m].x = as[i].x + MO - x;  // < 4 MO
          as[i].x += x;  // < 4 MO
        }
        prod *= FFT_RATIOS[__builtin_ctz(++h)];
      }
    }
    if (m >>= 1) {
      Mint prod = 1U;
      for (int h = 0, i0 = 0; i0 < n; i0 += (m << 1)) {
        for (int i = i0; i < i0 + m; ++i) {
          const unsigned x = (prod * as[i + m]).x;  // < MO
          as[i].x = (as[i].x >= MO2) ? (as[i].x - MO2) : as[i].x;  // < 2 MO
          as[i + m].x = as[i].x + MO - x;  // < 3 MO
          as[i].x += x;  // < 3 MO
        }
        prod *= FFT_RATIOS[__builtin_ctz(++h)];
      }
    }
  }
  for (int i = 0; i < n; ++i) {
    as[i].x = (as[i].x >= MO2) ? (as[i].x - MO2) : as[i].x;  // < 2 MO
    as[i].x = (as[i].x >= MO) ? (as[i].x - MO) : as[i].x;  // < MO
  }
}

// as[i] <- (1/n) \sum_j \zeta^(-ij) as[rev(j)]
void invFft(Mint *as, int n) {
  assert(!(n & (n - 1))); assert(1 <= n); assert(n <= 1 << FFT_MAX);
  int m = 1;
  if (m < n >> 1) {
    Mint prod = 1U;
    for (int h = 0, i0 = 0; i0 < n; i0 += (m << 1)) {
      for (int i = i0; i < i0 + m; ++i) {
        const unsigned long long y = as[i].x + MO - as[i + m].x;  // < 2 MO
        as[i].x += as[i + m].x;  // < 2 MO
        as[i + m].x = (prod.x * y) % MO;  // < MO
      }
      prod *= INV_FFT_RATIOS[__builtin_ctz(++h)];
    }
    m <<= 1;
  }
  for (; m < n >> 1; m <<= 1) {
    Mint prod = 1U;
    for (int h = 0, i0 = 0; i0 < n; i0 += (m << 1)) {
      for (int i = i0; i < i0 + (m >> 1); ++i) {
        const unsigned long long y = as[i].x + MO2 - as[i + m].x;  // < 4 MO
        as[i].x += as[i + m].x;  // < 4 MO
        as[i].x = (as[i].x >= MO2) ? (as[i].x - MO2) : as[i].x;  // < 2 MO
        as[i + m].x = (prod.x * y) % MO;  // < MO
      }
      for (int i = i0 + (m >> 1); i < i0 + m; ++i) {
        const unsigned long long y = as[i].x + MO - as[i + m].x;  // < 2 MO
        as[i].x += as[i + m].x;  // < 2 MO
        as[i + m].x = (prod.x * y) % MO;  // < MO
      }
      prod *= INV_FFT_RATIOS[__builtin_ctz(++h)];
    }
  }
  if (m < n) {
    for (int i = 0; i < m; ++i) {
      const unsigned y = as[i].x + MO2 - as[i + m].x;  // < 4 MO
      as[i].x += as[i + m].x;  // < 4 MO
      as[i + m].x = y;  // < 4 MO
    }
  }
  const Mint invN = Mint(n).inv();
  for (int i = 0; i < n; ++i) {
    as[i] *= invN;
  }
}

void fft(vector<Mint> &as) {
  fft(as.data(), as.size());
}
void invFft(vector<Mint> &as) {
  invFft(as.data(), as.size());
}

vector<Mint> convolve(vector<Mint> as, vector<Mint> bs) {
  if (as.empty() || bs.empty()) return {};
  const int len = as.size() + bs.size() - 1;
  int n = 1;
  for (; n < len; n <<= 1) {}
  as.resize(n); fft(as);
  bs.resize(n); fft(bs);
  for (int i = 0; i < n; ++i) as[i] *= bs[i];
  invFft(as);
  as.resize(len);
  return as;
}
vector<Mint> square(vector<Mint> as) {
  if (as.empty()) return {};
  const int len = as.size() + as.size() - 1;
  int n = 1;
  for (; n < len; n <<= 1) {}
  as.resize(n); fft(as);
  for (int i = 0; i < n; ++i) as[i] *= as[i];
  invFft(as);
  as.resize(len);
  return as;
}
////////////////////////////////////////////////////////////////////////////////


int N, M, L, R;
Mint P, Q;
vector<int> X;

vector<Mint> F;


namespace brute {
vector<Mint> run() {
cerr<<"[brute::run]"<<endl;
  vector<Mint> ans;
  auto fs = F;
  for (int t = 1; t <= R; ++t) {
    vector<Mint> gs(M + 1, 0);
    gs[0] += fs[0];
    gs[M] += fs[M];
    for (int i = 1; i < M; ++i) {
      gs[i - 1] += fs[i] * Q;
      gs[i] += fs[i] * (1 - 2 * Q);
      gs[i + 1] += fs[i] * Q;
    }
    fs = gs;
    if (L <= t && t <= R) {
      Mint sum = 0;
      for (int i = 0; i <= M; ++i) {
        sum += fs[i] * min(i, M - i);
      }
      ans.push_back(sum);
    }
  }
  return ans;
}
}  // brute


namespace single {
vector<Mint> mul(const vector<Mint> &as, const vector<Mint> &bs) {
  auto cs = convolve(as, bs);
  for (int i = (int)cs.size(); --i >= 2 * M; ) cs[i - 2 * M] += cs[i];
  cs.resize(2 * M);
  return cs;
}
vector<Mint> power(vector<Mint> as, int e) {
  vector<Mint> bs(2 * M, 0);
  bs[0] = 1;
  for (; ; as = mul(as, as)) {
    if (e & 1) bs = mul(bs, as);
    if (!(e >>= 1)) return bs;
  }
}
vector<Mint> run() {
cerr<<"[single::run]"<<endl;
  vector<Mint> fs(2 * M, 0);
  for (int i = 1; i < M; ++i) {
    fs[i] += F[i];
    fs[2 * M - i] -= F[i];
  }
  vector<Mint> qs(2 * M, 0);
  qs[0] = 1 - 2 * Q;
  qs[1] = qs[2 * M - 1] = Q;
  const auto gs = mul(fs, power(qs, R));
  Mint ans = 0;
  for (int i = 1; i < M; ++i) {
    ans += gs[i] * min(i, M - i);
  }
  return {ans};
}
}  // single


int main() {
  for (; ~scanf("%d%d%u%d%d", &N, &M, &P.x, &L, &R); ) {
    X.resize(N);
    for (int i = 0; i < N; ++i) {
      scanf("%d", &X[i]);
    }
    
    Q = P * (1 - P);
    
    {
      vector<Mint> fs(M + 1, 0), fsRev(M + 1, 0);
      for (int i = 0; i < N; ++i) {
        fs[X[i]] += 1;
        fsRev[M - X[i]] += 1;
      }
      const auto prod = convolve(fs, fsRev);
      F.assign(M + 1, 0);
      for (int i = 0; i <= M; ++i) {
        F[i] += prod[M + i];
      }
      F[0] -= N;
    }
// cerr<<"F = "<<F<<endl;
    
    vector<Mint> ans;
    if (R - L + 1 <= 1) {
      ans = single::run();
    } else {
      ans = brute::run();
    }
    for (int h = 0; h < (int)ans.size(); ++h) {
      if (h) printf(" ");
      printf("%u", ans[h].x);
    }
    puts("");
  }
  return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Subtask #1:

score: 5
Accepted

Test #1:

score: 5
Accepted
time: 317ms
memory: 4040kb

input:

7500 7500 96132844 1 7500
1791 817 5559 4742 5272 3988 6672 1355 2783 5552 6885 5321 5996 6495 3072 2241 5527 856 6250 2741 4223 1560 6529 5330 3517 2637 6577 244 1739 5147 2648 6466 1479 7340 7355 176 183 1417 2943 5134 3879 3574 734 4880 7451 3778 1466 5237 2015 1334 6105 4859 1331 5805 3175 4795 ...

output:

107146521 488242901 833543364 942893118 320285439 306745340 85380418 480027337 540734953 491950738 458848527 302817505 548924517 963679504 322777659 657420416 538451400 200569821 907146642 940780727 947566362 523285833 942400409 151786157 800926749 797312944 150412848 483203343 637066163 296999542 7...

result:

ok 7500 numbers

Test #2:

score: 0
Accepted
time: 312ms
memory: 4328kb

input:

7500 7499 673240178 1 7499
5325 2885 1225 7126 4988 4269 658 4221 3543 5162 3938 4780 143 2660 6991 5150 5888 6531 6373 6826 2873 5241 5052 793 5475 6299 3991 2399 5665 3786 7339 2749 1696 2681 583 936 5639 6299 4560 3177 6767 3089 4368 4458 650 6558 504 6277 5953 486 6093 1002 7466 5944 952 1796 26...

output:

109401794 751123382 342076416 876406297 327121602 311591650 658676729 820335019 101216944 433427180 230881034 816626094 344216982 198597590 550358617 514078855 683479653 690443997 798617649 473086234 4628208 388804376 899390057 607945374 81999043 497907004 96630466 310290755 759301009 878290881 3611...

result:

ok 7499 numbers

Subtask #2:

score: 5
Accepted

Dependency #1:

100%
Accepted

Test #3:

score: 5
Accepted
time: 322ms
memory: 4088kb

input:

100000 7500 118222194 1 7500
3879 2242 3106 4127 506 5025 480 5913 2013 3740 650 2202 1577 2978 6555 6199 5338 381 936 7430 993 4028 5741 6540 6422 4252 2131 7437 5068 987 4811 7124 6065 6410 2109 6632 1991 995 78 4504 4427 2610 5727 3929 1822 1439 1017 4818 7129 5473 5854 3349 5040 4434 7465 3155 1...

output:

282177948 793195087 371410272 216302166 754838287 635906627 439235084 549238170 147552281 407585707 39424623 564372511 864932973 510959225 287498668 535739056 868188763 901535442 654683909 226988238 902028211 161262841 221883186 568157461 482406651 216671554 376345332 170647927 14316551 761201715 90...

result:

ok 7500 numbers

Test #4:

score: 0
Accepted
time: 321ms
memory: 4008kb

input:

100000 7499 747110152 1 7499
5187 1708 2112 4578 2265 288 4560 2351 944 4258 6394 3390 697 4182 532 833 82 3658 533 5870 5590 3592 6478 144 3929 4926 1845 2566 1063 4570 4748 5802 34 1128 876 3815 2323 4979 1508 4139 4002 4135 5945 611 1844 2457 6689 3266 6857 6852 2214 3486 5429 5273 1659 3586 7195...

output:

66587322 285203560 2811948 574520751 858297444 536639754 74432038 182648309 281510238 841004083 735652999 528557891 469508052 915681980 763925994 45174777 229418630 803369770 610703721 893113152 894067444 913745695 914305706 556012225 267456134 482474991 686056644 746085405 285733366 751933635 95587...

result:

ok 7499 numbers

Subtask #3:

score: 10
Accepted

Test #5:

score: 10
Accepted
time: 70ms
memory: 4768kb

input:

100000 7500 500440646 935892941 935892941
3280 7218 1216 489 4036 7029 5538 4805 2544 568 4303 816 739 2284 1294 6062 808 3029 3565 4344 7124 3917 705 3637 6076 2019 4233 2032 7327 5672 2872 2593 22 1534 2071 5782 3228 5460 1217 5138 7285 3679 2751 213 2242 2673 2746 7041 7001 860 2591 7347 3330 213...

output:

768801558

result:

ok 1 number(s): "768801558"

Test #6:

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

input:

100000 7499 356847081 883948227 883948227
549 2423 3380 3811 4666 3645 5857 7184 7137 861 2619 519 409 1607 2298 7164 2216 2856 6790 6857 405 1928 5391 2949 6345 4839 2372 2974 4699 2688 6768 684 2012 3642 6225 6948 5313 6936 876 38 3004 7440 4671 208 4906 4714 7067 3424 3163 6165 115 4974 2178 4613...

output:

701047464

result:

ok 1 number(s): "701047464"

Subtask #4:

score: 0
Time Limit Exceeded

Dependency #2:

100%
Accepted

Dependency #3:

100%
Accepted

Test #7:

score: 0
Time Limit Exceeded

input:

100000 7500 324870432 583103598 583203597
2819 6279 3295 3707 2120 6990 14 1246 3567 6766 4198 4413 2123 5272 6818 7182 6920 287 2185 5195 5539 6080 2986 1536 1159 3669 2790 3383 1417 768 3646 7228 1888 1231 2202 2896 472 1958 5142 3740 5892 378 6359 7270 7407 2208 4685 5740 3022 2649 1295 5114 2256...

output:


result:


Subtask #5:

score: 15
Accepted

Test #9:

score: 15
Accepted
time: 267ms
memory: 10192kb

input:

100000 50000 559705157 50000 50000
27437 48841 4744 41269 30017 24703 22660 38617 9707 42083 31500 14053 45335 20769 16455 30887 31847 6833 44822 14557 15400 18868 15093 47184 35490 48961 45686 45613 297 31598 7021 9194 30432 14570 44495 39114 21800 16034 12668 49738 20083 31717 22713 34958 46363 35...

output:

397469689

result:

ok 1 number(s): "397469689"

Test #10:

score: 0
Accepted
time: 298ms
memory: 10128kb

input:

100000 49999 86745154 49997 49997
48426 40553 19077 46485 43804 17022 31056 13627 31226 10367 13637 44826 33994 23159 9781 40172 19370 28896 31766 935 6943 7363 19203 27692 39512 28209 3294 33567 40851 19398 34866 35532 30821 43403 26783 26807 38940 48872 23076 40143 45338 36152 20857 38807 43963 49...

output:

785463309

result:

ok 1 number(s): "785463309"

Subtask #6:

score: 0
Time Limit Exceeded

Dependency #2:

100%
Accepted

Dependency #5:

100%
Accepted

Test #11:

score: 0
Time Limit Exceeded

input:

100000 50000 799022751 1 50000
6127 37738 3322 30488 14059 41183 40655 527 40437 41308 26035 11159 17054 31523 41372 12724 40510 17809 24956 2478 14840 31523 39246 2098 35444 14693 43715 42208 31806 7186 33566 26842 17243 5147 31608 8099 24527 33767 18091 4559 7237 41097 13970 41388 25507 28832 9301...

output:


result:


Subtask #7:

score: 5
Accepted

Dependency #3:

100%
Accepted

Dependency #5:

100%
Accepted

Test #13:

score: 5
Accepted
time: 517ms
memory: 9952kb

input:

100000 50000 116210524 739331537 739331537
28468 1684 43774 20012 16143 30422 26320 37470 18602 45764 9197 38675 11335 27052 37930 43558 38514 33720 36786 38149 12759 25898 29143 2671 47186 19877 19582 43378 16434 38070 37702 34232 24160 26875 14303 18186 6218 46623 41768 774 25988 12859 39939 9327 ...

output:

568504960

result:

ok 1 number(s): "568504960"

Test #14:

score: 0
Accepted
time: 577ms
memory: 10112kb

input:

100000 49999 838141856 974772137 974772137
12398 11958 19317 41187 48622 10113 28135 30927 4722 15323 37359 14284 4941 3540 46847 36704 6686 44955 29141 1546 945 42278 22876 48424 2519 46807 36818 19133 27934 45030 42377 36609 43243 2201 5986 36346 36683 5568 38112 33025 5690 2352 45838 42477 12959 ...

output:

573389237

result:

ok 1 number(s): "573389237"

Subtask #8:

score: 10
Accepted

Dependency #7:

100%
Accepted

Test #15:

score: 10
Accepted
time: 1119ms
memory: 16332kb

input:

100000 100000 187748990 613573870 613573870
98286 9398 93591 63433 65397 2084 94309 66738 9828 86362 42304 91596 20320 24261 99837 55266 2704 95755 44187 42056 5011 63865 47214 36791 11658 57641 48212 33208 99844 62177 43723 36732 65162 52978 60255 25999 32926 41172 22088 84345 96206 63169 47386 770...

output:

602817796

result:

ok 1 number(s): "602817796"

Test #16:

score: 0
Accepted
time: 1148ms
memory: 16264kb

input:

100000 99999 50496054 533806148 533806148
87381 3252 39269 96687 14123 42131 4056 34376 1333 5719 61225 15637 76409 22015 67476 14666 12999 76239 96322 24189 92459 87856 14475 50321 50062 76065 75381 10556 5794 50168 58290 24290 61555 98937 28946 42169 36726 4937 78250 46542 50606 91642 87254 24356 ...

output:

175390926

result:

ok 1 number(s): "175390926"

Subtask #9:

score: 0
Skipped

Dependency #6:

0%

Subtask #10:

score: 0
Skipped

Dependency #4:

0%