QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#516820#7981. 连连看NOI_AK_ME100 ✓542ms55640kbC++2317.7kb2024-08-12 22:05:132024-08-12 22:05:13

Judging History

This is the latest submission verdict.

  • [2024-08-12 22:05:13]
  • Judged
  • Verdict: 100
  • Time: 542ms
  • Memory: 55640kb
  • [2024-08-12 22:05:13]
  • Submitted

answer

#pragma GCC optimize("Ofast")

#include <cassert>
#include <cstdio>
#include <numeric>
#include <utility>
#include <vector>
#include <algorithm>

using namespace std;

using Int = long long;

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 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); }
};

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};

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;
      as[i + m].x = as[i].x + MO - x;
      as[i].x += x;
    }
  }
  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
  }
}

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());
}

constexpr int LIM_INV = 1 << 20;  // @
Mint inv[LIM_INV], fac[LIM_INV], invFac[LIM_INV];
struct ModIntPreparator {
  ModIntPreparator() {
    inv[1] = 1;
    for (int i = 2; i < LIM_INV; ++i) inv[i] = -((Mint::M / i) * inv[Mint::M % i]);
    fac[0] = 1;
    for (int i = 1; i < LIM_INV; ++i) fac[i] = fac[i - 1] * i;
    invFac[0] = 1;
    for (int i = 1; i < LIM_INV; ++i) invFac[i] = invFac[i - 1] * inv[i];
  }
} preparator;

static constexpr int LIM_POLY = 1 << 20;
static Mint polyWork0[LIM_POLY], polyWork1[LIM_POLY], polyWork2[LIM_POLY], polyWork3[LIM_POLY];

struct Poly : public vector<Mint> {
  Poly() {}
  explicit Poly(int n) : vector<Mint>(n) {}
  Poly(const vector<Mint> &vec) : vector<Mint>(vec) {}
  Poly(std::initializer_list<Mint> il) : vector<Mint>(il) {}
  int size() const { return vector<Mint>::size(); }
  Mint at(long long k) const { return (0 <= k && k < size()) ? (*this)[k] : 0U; }
  int ord() const { for (int i = 0; i < size(); ++i) if ((*this)[i]) return i; return -1; }
  int deg() const { for (int i = size(); --i >= 0; ) if ((*this)[i]) return i; return -1; }
  Poly mod(int n) const { return Poly(vector<Mint>(data(), data() + min(n, size()))); }

  Poly &operator+=(const Poly &fs) {
    if (size() < fs.size()) resize(fs.size());
    for (int i = 0; i < fs.size(); ++i) (*this)[i] += fs[i];
    return *this;
  }
  Poly &operator-=(const Poly &fs) {
    if (size() < fs.size()) resize(fs.size());
    for (int i = 0; i < fs.size(); ++i) (*this)[i] -= fs[i];
    return *this;
  }
  Poly &operator*=(const Poly &fs) {
    if (empty() || fs.empty()) return *this = {};
    const int nt = size(), nf = fs.size();
    int n = 1;
    for (; n < nt + nf - 1; n <<= 1) {}
    assert(n <= LIM_POLY);
    resize(n);
    fft(data(), n);
    __builtin_memcpy(polyWork0, fs.data(), nf * sizeof(Mint));
    __builtin_memset(polyWork0 + nf, 0, (n - nf) * sizeof(Mint));
    fft(polyWork0, n);
    for (int i = 0; i < n; ++i) (*this)[i] *= polyWork0[i];
    invFft(data(), n);
    resize(nt + nf - 1);
    return *this;
  }
  Poly &operator/=(const Poly &fs) {
    const int m = deg(), n = fs.deg();
    assert(n != -1);
    if (m < n) return *this = {};
    Poly tsRev(m - n + 1), fsRev(min(m - n, n) + 1);
    for (int i = 0; i <= m - n; ++i) tsRev[i] = (*this)[m - i];
    for (int i = 0, i0 = min(m - n, n); i <= i0; ++i) fsRev[i] = fs[n - i];
    const Poly qsRev = tsRev.div(fsRev, m - n + 1);
    resize(m - n + 1);
    for (int i = 0; i <= m - n; ++i) (*this)[i] = qsRev[m - n - i];
    return *this;
  }
  Poly &operator%=(const Poly &fs) {
    const Poly qs = *this / fs;
    *this -= fs * qs;
    resize(deg() + 1);
    return *this;
  }
  Poly &operator*=(const Mint &a) {
    for (int i = 0; i < size(); ++i) (*this)[i] *= a;
    return *this;
  }
  Poly &operator/=(const Mint &a) {
    const Mint b = a.inv();
    for (int i = 0; i < size(); ++i) (*this)[i] *= b;
    return *this;
  }
  Poly operator+() const { return *this; }
  Poly operator-() const {
    Poly fs(size());
    for (int i = 0; i < size(); ++i) fs[i] = -(*this)[i];
    return fs;
  }
  Poly operator+(const Poly &fs) const { return (Poly(*this) += fs); }
  Poly operator-(const Poly &fs) const { return (Poly(*this) -= fs); }
  Poly operator*(const Poly &fs) const { return (Poly(*this) *= fs); }
  Poly operator/(const Poly &fs) const { return (Poly(*this) /= fs); }
  Poly operator%(const Poly &fs) const { return (Poly(*this) %= fs); }
  Poly operator*(const Mint &a) const { return (Poly(*this) *= a); }
  Poly operator/(const Mint &a) const { return (Poly(*this) /= a); }
  friend Poly operator*(const Mint &a, const Poly &fs) { return fs * a; }

  Poly inv(int n) const {
    assert(!empty()); assert((*this)[0]); assert(1 <= n);
    assert(n == 1 || 1 << (32 - __builtin_clz(n - 1)) <= LIM_POLY);
    Poly fs(n);
    fs[0] = (*this)[0].inv();
    for (int m = 1; m < n; m <<= 1) {
      __builtin_memcpy(polyWork0, data(), min(m << 1, size()) * sizeof(Mint));
      __builtin_memset(polyWork0 + min(m << 1, size()), 0, ((m << 1) - min(m << 1, size())) * sizeof(Mint));
      fft(polyWork0, m << 1);
      __builtin_memcpy(polyWork1, fs.data(), min(m << 1, n) * sizeof(Mint));
      __builtin_memset(polyWork1 + min(m << 1, n), 0, ((m << 1) - min(m << 1, n)) * sizeof(Mint));
      fft(polyWork1, m << 1);
      for (int i = 0; i < m << 1; ++i) polyWork0[i] *= polyWork1[i];
      invFft(polyWork0, m << 1);
      __builtin_memset(polyWork0, 0, m * sizeof(Mint));
      fft(polyWork0, m << 1);
      for (int i = 0; i < m << 1; ++i) polyWork0[i] *= polyWork1[i];
      invFft(polyWork0, m << 1);
      for (int i = m, i0 = min(m << 1, n); i < i0; ++i) fs[i] = -polyWork0[i];
    }
    return fs;
  }
  Poly div(const Poly &fs, int n) const {
    assert(!fs.empty()); assert(fs[0]); assert(1 <= n);
    if (n == 1) return {at(0) / fs[0]};
    const int m = 1 << (31 - __builtin_clz(n - 1));
    assert(m << 1 <= LIM_POLY);
    Poly gs = fs.inv(m);
    gs.resize(m << 1);
    fft(gs.data(), m << 1);
    __builtin_memcpy(polyWork0, data(), min(m, size()) * sizeof(Mint));
    __builtin_memset(polyWork0 + min(m, size()), 0, ((m << 1) - min(m, size())) * sizeof(Mint));
    fft(polyWork0, m << 1);
    for (int i = 0; i < m << 1; ++i) polyWork0[i] *= gs[i];
    invFft(polyWork0, m << 1);
    Poly hs(n);
    __builtin_memcpy(hs.data(), polyWork0, m * sizeof(Mint));
    __builtin_memset(polyWork0 + m, 0, m * sizeof(Mint));
    fft(polyWork0, m << 1);
    __builtin_memcpy(polyWork1, fs.data(), min(m << 1, fs.size()) * sizeof(Mint));
    __builtin_memset(polyWork1 + min(m << 1, fs.size()), 0, ((m << 1) - min(m << 1, fs.size())) * sizeof(Mint));
    fft(polyWork1, m << 1);
    for (int i = 0; i < m << 1; ++i) polyWork0[i] *= polyWork1[i];
    invFft(polyWork0, m << 1);
    __builtin_memset(polyWork0, 0, m * sizeof(Mint));
    for (int i = m, i0 = min(m << 1, size()); i < i0; ++i) polyWork0[i] -= (*this)[i];
    fft(polyWork0, m << 1);
    for (int i = 0; i < m << 1; ++i) polyWork0[i] *= gs[i];
    invFft(polyWork0, m << 1);
    for (int i = m; i < n; ++i) hs[i] = -polyWork0[i];
    return hs;
  }
  Poly shift(const Mint &a) const {
    if (empty()) return {};
    const int n = size();
    int m = 1;
    for (; m < n; m <<= 1) {}
    for (int i = 0; i < n; ++i) polyWork0[i] = fac[i] * (*this)[i];
    __builtin_memset(polyWork0 + n, 0, ((m << 1) - n) * sizeof(Mint));
    fft(polyWork0, m << 1);
    {
      Mint aa = 1;
      for (int i = 0; i < n; ++i) { polyWork1[n - 1 - i] = invFac[i] * aa; aa *= a; }
    }
    __builtin_memset(polyWork1 + n, 0, ((m << 1) - n) * sizeof(Mint));
    fft(polyWork1, m << 1);
    for (int i = 0; i < m << 1; ++i) polyWork0[i] *= polyWork1[i];
    invFft(polyWork0, m << 1);
    Poly fs(n);
    for (int i = 0; i < n; ++i) fs[i] = invFac[i] * polyWork0[n - 1 + i];
    return fs;
  }
};

struct SubproductTree {
  int logN, n, nn;
  vector<Mint> xs, buf;
  vector<Mint *> gss;
  Poly all;
  SubproductTree(const vector<Mint> &xs_) {
    n = xs_.size();
    for (logN = 0, nn = 1; nn < n; ++logN, nn <<= 1) {}
    xs.assign(nn, 0U);
    __builtin_memcpy(xs.data(), xs_.data(), n * sizeof(Mint));
    buf.assign((logN + 1) * (nn << 1), 0U);
    gss.assign(nn << 1, nullptr);
    for (int h = 0; h <= logN; ++h) for (int u = 1 << h; u < 1 << (h + 1); ++u) {
      gss[u] = buf.data() + (h * (nn << 1) + ((u - (1 << h)) << (logN - h + 1)));
    }
    for (int i = 0; i < nn; ++i) {
      gss[nn + i][0] = -xs[i] + 1;
      gss[nn + i][1] = -xs[i] - 1;
    }
    if (nn == 1) gss[1][1] += 2;
    for (int h = logN; --h >= 0; ) {
      const int m = 1 << (logN - h);
      for (int u = 1 << (h + 1); --u >= 1 << h; ) {
        for (int i = 0; i < m; ++i) gss[u][i] = gss[u << 1][i] * gss[u << 1 | 1][i];
        __builtin_memcpy(gss[u] + m, gss[u], m * sizeof(Mint));
        invFft(gss[u] + m, m);
        if (h > 0) {
          gss[u][m] -= 2;
          const Mint a = FFT_ROOTS[logN - h + 1];
          Mint aa = 1;
          for (int i = m; i < m << 1; ++i) { gss[u][i] *= aa; aa *= a; };
          fft(gss[u] + m, m);
        }
      }
    }
    all.resize(nn + 1);
    all[0] = 1;
    for (int i = 1; i < nn; ++i) all[i] = gss[1][nn + nn - i];
    all[nn] = gss[1][nn] - 1;
  }
};

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 two[LIM_INV], invTwo[LIM_INV];

int N, M;
vector<Mint> P, Q;

Poly comp1(Poly fs, int n) {
  reverse(fs.begin(), fs.end());
  fs = fs.shift(inv[4]);
  Poly gs(2 * fs.size() - 1);
  for (int i = 0; i < fs.size(); ++i) gs[2 * i] = (i&1?-1:+1) * fs[i];
  gs = gs.shift(inv[2]);
  for (int i = 1; i < gs.size(); i += 2) gs[i] = -gs[i];
  Poly bns(n);
  for (int i = 0; i < bns.size(); ++i) bns[i] = binom(-(fs.size() - 1), i) * (i&1?-1:+1);
  return (bns * gs).mod(n);
}

Poly comp0(Poly fs, int n) {
  reverse(fs.begin(), fs.end());
  fs = fs.shift(1);
  for (int i = 1; i < fs.size(); i += 2) fs[i] = -fs[i];
  Poly bns(n);
  for (int i = 0; i < bns.size(); ++i) bns[i] = binom(-(fs.size() - 1), i) * (i&1?-1:+1);
  return (bns * fs).mod(n);
}

Mint fast2() {
  Poly LOG(N + 1);
  for (int i = 1; i < LOG.size(); ++i) LOG[i] = inv[i] * ((i-1)&1?-1:+1) * two[i];
  Poly pss[2], qss[2];
  for (int s = 0; s < 2; ++s) {
    Poly ps(N);
    for (int n = 0; n < N; ++n) ps[n] = P[n] * (s ? n : 1);
    pss[s] = comp1(ps, N + 1);
  }
  for (int s = 0; s < 2; ++s) {
    Poly qs(M);
    for (int m = 0; m < M; ++m) qs[m] = Q[m] * (s ? m : 1);
    qss[s] = comp0(qs, N + 1);
  }
  const Poly prod10 = (pss[1] * qss[0]).mod(N + 1);
  const Poly prod01 = (pss[0] * qss[1]).mod(N + 1);
  const Poly prod00 = (pss[0] * qss[0]).mod(N + 1);
  Poly gs0 = 2 * prod10 + prod01 + prod00;
  Poly gs1 = inv[2] * (prod10 + prod01 + prod00);
  Poly gs2 = prod00;
  for (int i = 1; i < gs0.size(); ++i) gs0[i] += gs0[i - 1];
  for (int i = 1; i < gs1.size(); ++i) gs1[i] += gs1[i - 1];
  for (int i = 1; i < gs1.size(); ++i) gs1[i] += gs1[i - 1];
  for (int i = 1; i < gs2.size(); ++i) gs2[i] += gs2[i - 1];
  gs0.insert(gs0.begin(), 0);
  gs2.insert(gs2.begin(), 0);
  const Mint ans = (gs0 - LOG * (gs1 + gs2)).at(N);
  return ans;
}


main() {
  two[0] = invTwo[0] = 1;
  #pragma unroll
  for (unsigned i = 1; i < LIM_INV; ++i) {
    two[i] = two[i - 1] * 2; invTwo[i] = invTwo[i - 1] * inv[2];
  }

  for (; ~scanf("%d%d", &N, &M);) {
    P.resize(N); for (unsigned n = 0; n ^ N; ++n) scanf("%u", &P[n].x);
    Q.resize(M); for (unsigned m = 0; m ^ M; ++m) scanf("%u", &Q[m].x);

    const Mint ans = fast2();
    printf("%u\n", ans.x);
  }
}

詳細信息

Subtask #1:

score: 5
Accepted

Test #1:

score: 5
Accepted
time: 20ms
memory: 27960kb

input:

10 1
436776826 432758128 685469213 299666165 560024023 164205947 566410801 272911383 482196964 529609877
636194254

output:

430968024

result:

ok answer is 430968024

Subtask #2:

score: 5
Accepted

Dependency #1:

100%
Accepted

Test #2:

score: 5
Accepted
time: 11ms
memory: 27044kb

input:

17 1
982700631 693916848 42429898 889946453 499087425 642301896 655367450 518004917 854286038 351220978 439658525 238604566 153432838 693233927 38952401 571544312 503159860
563715026

output:

474474973

result:

ok answer is 474474973

Subtask #3:

score: 10
Accepted

Dependency #2:

100%
Accepted

Test #3:

score: 10
Accepted
time: 18ms
memory: 27364kb

input:

114 514
584448426 351347308 467269470 533554414 265433569 599198779 891168984 391489696 315001571 828395757 367554971 765300391 793383668 206935088 174339286 421576606 662493359 733196220 159892683 838850851 897513495 787501887 750976216 517359523 100706027 227839610 567757288 951497220 361043911 73...

output:

226020434

result:

ok answer is 226020434

Test #4:

score: 10
Accepted
time: 12ms
memory: 27684kb

input:

1000 1500
749087237 580069618 244395903 179348861 633982066 471868037 189321271 25891439 252295750 343482130 653570886 726766631 453599649 763786667 337674955 656988311 899572248 579161921 324722444 393834089 157435160 171016665 92448011 605460453 265076472 201614530 315422434 77041710 894875698 471...

output:

31273742

result:

ok answer is 31273742

Test #5:

score: 10
Accepted
time: 18ms
memory: 28128kb

input:

2000 2000
782821308 245787868 499495585 196715242 888965880 553349683 991468870 665586186 714649928 570543632 991768405 277852473 356003829 241896459 615150292 597267146 819700253 33479995 308208762 197690588 852108088 437127423 579601172 179660538 463059556 4721697 569500905 63461335 405610624 7006...

output:

292840233

result:

ok answer is 292840233

Subtask #4:

score: 30
Accepted

Dependency #2:

100%
Accepted

Test #6:

score: 30
Accepted
time: 103ms
memory: 30256kb

input:

33333 23333
0 0 0 0 0 442954227 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 143309072 0 0 0 0 0 0 0 0 0 0 0 346791213 0 0 0 0 153102843 0 0 0 823100248 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 885888718 0 0 0 244638491 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...

output:

275826392

result:

ok answer is 275826392

Test #7:

score: 30
Accepted
time: 67ms
memory: 31944kb

input:

23333 33333
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...

output:

487460633

result:

ok answer is 487460633

Test #8:

score: 30
Accepted
time: 118ms
memory: 31856kb

input:

44444 49494
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 356788631 0 0 0 0 0 0 0 483564717 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 60336724 0 0 0 0 0 0 0 0 0 0 0 914766006 0 0 0 0 0 0 0 0 0 267579499 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 249170903 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0...

output:

810060943

result:

ok answer is 810060943

Test #9:

score: 30
Accepted
time: 112ms
memory: 31284kb

input:

42847 49843
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...

output:

620558594

result:

ok answer is 620558594

Test #10:

score: 30
Accepted
time: 127ms
memory: 35500kb

input:

50000 50000
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...

output:

613863829

result:

ok answer is 613863829

Test #11:

score: 30
Accepted
time: 118ms
memory: 34660kb

input:

50000 50000
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...

output:

731349494

result:

ok answer is 731349494

Test #12:

score: 30
Accepted
time: 117ms
memory: 32596kb

input:

49449 49944
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...

output:

144180963

result:

ok answer is 144180963

Test #13:

score: 30
Accepted
time: 123ms
memory: 35192kb

input:

49999 49996
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...

output:

486056857

result:

ok answer is 486056857

Test #14:

score: 30
Accepted
time: 129ms
memory: 31556kb

input:

50000 50000
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...

output:

63660514

result:

ok answer is 63660514

Test #15:

score: 30
Accepted
time: 110ms
memory: 31828kb

input:

50000 10240
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 762924591 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...

output:

163141580

result:

ok answer is 163141580

Test #16:

score: 30
Accepted
time: 131ms
memory: 32112kb

input:

50000 50000
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...

output:

92718912

result:

ok answer is 92718912

Subtask #5:

score: 10
Accepted

Dependency #2:

100%
Accepted

Test #17:

score: 10
Accepted
time: 219ms
memory: 42436kb

input:

131071 1
516985721 415555898 364470040 595640647 23267856 245987853 536920404 4369067 336218537 549024161 847305751 279350806 266155898 812564376 720249234 990450532 331846516 598842084 72991117 590077489 768078071 68245591 767633213 267407805 812810600 411038805 834889303 284405878 686730521 778715...

output:

352885535

result:

ok answer is 352885535

Test #18:

score: 10
Accepted
time: 259ms
memory: 44152kb

input:

131072 1
50819655 292859279 434782216 168640429 563087600 71817209 344308082 257400450 428990378 143345746 109031697 678477053 227495272 824579743 119816499 891987813 969240016 55003924 910415661 482743850 492590472 379112733 277286099 847002200 37434454 981128776 730555442 264297331 846816247 41121...

output:

920021979

result:

ok answer is 920021979

Test #19:

score: 10
Accepted
time: 369ms
memory: 44512kb

input:

131073 1
329161150 193066565 854054597 203771668 528766223 256519179 567104701 710044832 522099828 827638663 183979385 982613823 523131674 303280838 265629448 313541781 875181272 432639302 461676269 740082621 215191883 775831858 125137394 699858331 433647673 530273251 931171043 542133442 990263286 7...

output:

1278186

result:

ok answer is 1278186

Test #20:

score: 10
Accepted
time: 439ms
memory: 54552kb

input:

250000 1
994280255 701974932 554639375 837031691 28775591 259262525 84055411 940232456 357165264 801408906 721393779 309679248 667571974 997873050 393877774 855241076 152927297 289264201 125125746 163904683 627344149 24871759 620458235 800918981 566617651 46672739 241080957 979290178 21613769 417814...

output:

927341443

result:

ok answer is 927341443

Test #21:

score: 10
Accepted
time: 432ms
memory: 54728kb

input:

249999 1
548449618 284744484 3855488 41407418 921602795 700840193 986259770 674834095 692812797 807036395 425069821 409195128 813958147 920496892 817502686 585872954 192585888 543911691 490755243 837340690 872257178 499966952 75224984 346572576 304188969 802933716 414015701 263139645 480204723 92191...

output:

0

result:

ok answer is 0

Subtask #6:

score: 30
Accepted

Dependency #3:

100%
Accepted

Dependency #4:

100%
Accepted

Test #22:

score: 30
Accepted
time: 192ms
memory: 37724kb

input:

66666 56789
930534856 354504257 410659550 95776384 318291946 867897664 128390456 373855804 394806529 650844618 739679372 469033422 350835667 670156914 581456551 39558124 153862620 904324719 231284425 539830260 137542223 75790117 580700832 762385853 525781564 924974690 312244703 131357451 413392651 3...

output:

557813972

result:

ok answer is 557813972

Test #23:

score: 30
Accepted
time: 243ms
memory: 40476kb

input:

98989 99999
903138259 27245812 691230865 179422455 40066445 133053898 498875506 805588203 404102410 369095953 841446610 51068003 264764722 746206844 355347136 984811245 78212186 403642585 228096978 646580838 500767944 597786813 449648710 204859923 115737728 703696785 852707287 307198792 703392840 45...

output:

861778516

result:

ok answer is 861778516

Test #24:

score: 30
Accepted
time: 252ms
memory: 41468kb

input:

100000 100000
124045347 535131041 788372437 744444053 470909511 221601441 299879400 507510656 572780045 1523118 784890050 55499229 840987310 460102685 7788138 725625423 738370769 561811587 617932425 253547340 488594370 492254142 962616504 473857648 189346567 172113284 48924885 371793686 144416758 40...

output:

972652352

result:

ok answer is 972652352

Test #25:

score: 30
Accepted
time: 255ms
memory: 41296kb

input:

100000 100000
443263581 997593682 739910449 0 317108710 0 915454163 0 0 237609019 317425724 5327302 531665103 0 0 0 774235670 823561065 0 382988292 0 0 0 0 742546638 276784925 0 937431091 814311276 42636888 959735583 0 0 881222834 145803413 0 404786348 0 0 107815210 0 455533557 0 165277076 37960462 ...

output:

866298923

result:

ok answer is 866298923

Subtask #7:

score: 10
Accepted

Dependency #5:

100%
Accepted

Dependency #6:

100%
Accepted

Test #26:

score: 10
Accepted
time: 309ms
memory: 44296kb

input:

131072 131072
686581262 22615548 637924154 563964342 890907581 376822679 818765968 848877602 922758498 873299418 883530505 275270230 206068093 206432456 952914928 211901441 235125372 597841584 65450874 749198986 255476184 31115657 468866015 253909492 715452120 310491363 584567095 234981870 829639871...

output:

453341643

result:

ok answer is 453341643

Test #27:

score: 10
Accepted
time: 253ms
memory: 43160kb

input:

131071 131072
131350479 386941392 923597579 487011949 402726980 536917559 892696133 737195794 137204218 716857308 206754582 956624245 899248053 903319788 497285934 962101013 574645172 445282480 121969053 260341965 292809385 18279694 936392213 64312829 99946388 65025412 661648306 822439738 756408144 ...

output:

230904118

result:

ok answer is 230904118

Test #28:

score: 10
Accepted
time: 361ms
memory: 43540kb

input:

131072 131073
667477932 521823607 986109480 779340987 540809395 566948538 33919613 648732329 858030182 347845498 973257416 98486667 27930690 137293870 747176665 873356901 517933381 235816108 519021206 356998002 389916729 647346552 736056472 497408932 422280133 961410992 407896321 566420129 162424209...

output:

906258257

result:

ok answer is 906258257

Test #29:

score: 10
Accepted
time: 539ms
memory: 55460kb

input:

250000 250000
635944937 4081221 580138202 424871779 699443767 574139232 960714849 687693659 915812981 52394312 109439864 789971955 444898517 726860761 280553051 594491199 711941753 92891662 257142127 950816426 165550185 1585463 442523957 955020212 163512253 969360810 778981290 524531972 8825677 1437...

output:

370435768

result:

ok answer is 370435768

Test #30:

score: 10
Accepted
time: 534ms
memory: 55436kb

input:

250000 250000
16380875 846067148 837706491 0 21987384 356657226 0 0 854497583 254712412 85403295 774312448 289586017 805663154 184140964 0 0 236754763 0 726674943 992765180 0 994852261 837943082 101911186 0 541064600 574167500 948004853 84208408 819493231 472684373 117112046 196232304 913294952 4598...

output:

318416992

result:

ok answer is 318416992

Test #31:

score: 10
Accepted
time: 517ms
memory: 55640kb

input:

250000 250000
0 0 0 0 1 1 1 0 1 1 1 0 0 1 0 1 1 0 0 0 0 0 1 0 1 0 0 1 0 1 1 0 0 1 0 1 1 0 1 0 1 1 1 1 1 0 0 1 1 0 1 1 1 1 0 0 0 1 0 1 1 0 0 1 1 0 1 0 1 1 0 0 0 0 1 1 1 0 1 0 0 1 1 0 1 0 1 0 0 0 1 1 0 0 1 1 0 0 0 0 1 0 1 1 1 0 1 0 1 1 1 0 0 0 1 0 0 0 1 0 0 1 1 1 1 1 1 0 1 0 0 1 1 1 1 1 0 1 1 0 0 1 0 ...

output:

808938800

result:

ok answer is 808938800

Test #32:

score: 10
Accepted
time: 520ms
memory: 55488kb

input:

250000 250000
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ...

output:

772581140

result:

ok answer is 772581140

Test #33:

score: 10
Accepted
time: 542ms
memory: 55356kb

input:

250000 250000
905954234 939144055 535502376 504271377 908947131 607701153 495329073 959199978 45631351 508120906 327171268 150708512 162248666 875147835 548832918 671679063 322543054 545121657 334545552 918448955 214004216 738428987 106613797 281980315 585882976 918309818 323427427 80813204 16608335...

output:

240818788

result:

ok answer is 240818788

Test #34:

score: 10
Accepted
time: 447ms
memory: 45056kb

input:

131073 131073
582035627 167024773 235502208 661331653 134715871 968131223 209699909 75928612 836431471 44218 911734215 814417038 508668541 153178302 845768718 94238115 645879281 127851529 84301371 725328555 462905736 652778904 343415690 364716999 478919735 368626470 188964017 690057725 129275403 945...

output:

787724499

result:

ok answer is 787724499

Test #35:

score: 10
Accepted
time: 105ms
memory: 34924kb

input:

1 250000
264992293
426913556 569499287 174427885 183727925 288590751 108880501 99857896 903341544 301360330 940446143 795523415 751043578 172580908 772726048 703257949 937973817 629993403 185355734 166096468 453925308 21449525 749966315 84798295 334221921 230159777 915074804 47263172 113260641 59466...

output:

0

result:

ok answer is 0