QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#449136#8526. Polygon IIucup-team3215TL 2771ms12636kbC++203.9kb2024-06-20 18:35:222024-06-20 18:35:22

Judging History

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

  • [2024-06-20 18:35:22]
  • 评测
  • 测评结果:TL
  • 用时:2771ms
  • 内存:12636kb
  • [2024-06-20 18:35:22]
  • 提交

answer

#include <algorithm>
#include <cstdint>
#include <iostream>
#include <vector>

using namespace std;

constexpr int mod = 1e9 + 7, C = 51, N = 1e3 + 1;

using poly = vector<int>;

auto& mul(auto&& a, auto... b) { return ((a = a * (uint64_t)b % mod), ...); }
auto& add(auto&& a, auto... b) { return ((a -= (a += b) >= mod? mod: 0), ...); }
auto& adp(auto&& a, auto b, auto c) { return (a = (a + (uint64_t)b * c) % mod); }
auto& mad(auto&& a, auto b, auto c) { return (a = (a * (uint64_t)b + c) % mod); }
int inv_(int a) { for (int r = 1, b = mod - 2; ; mul(a, a), b /= 2) if (b % 2) mul(r, a); else if (!b) return r; }
poly dif(poly p, poly q) { if (p.size() < q.size()) p.resize(q.size()); for (int i = 0; i < q.size(); ++i) add(p[i], mod - q[i]); return p; }

int eval(const poly& p, int x) {
  int res = 0;
  for (int i = p.size(); i--; ) mad(res, x, p[i]);
  return res;
}

int inv[N];

poly ade(poly p) {
  for (int i = 0; i < p.size(); ++i) mul(p[i], inv[i + 1]);
  p.insert(p.begin(), 0);
  return p;
}

poly ksb(poly a, poly b) {
  poly res(a.size() + b.size() - 1);
  if (min(a.size(), b.size()) < 64) {
    for (int i = 0; i < a.size(); ++i)
    for (int j = 0; j < b.size(); ++j) adp(res[i + j], a[i], b[j]);
    return res;
  }
  int s = (max(a.size(), b.size()) + 1) / 2;
//  if (s == 58) cout << a.size() << ' ' << b.size() << ' ' << s << '\n';
  a.resize(s * 2);
  b.resize(s * 2);
  poly l = ksb({a.begin(), a.begin() + s}, {b.begin(), b.begin() + s});
  poly r = ksb({a.begin() + s, a.end()}, {b.begin() + s, b.end()});
  for (int i = 0; i < s; ++i) add(a[i], a[i + s]);
  for (int i = 0; i < s; ++i) add(b[i], b[i + s]);
  poly m = ksb({a.begin(), a.begin() + s}, {b.begin(), b.begin() + s});
  copy(l.begin(), l.end(), res.begin());
  copy_n(r.begin(), res.size() - s * 2, res.begin() + s * 2);
  for (int i = 0; i < min(m.size(), res.size() - s); ++i) res[i + s] = (res[i + s] + m[i] + 2ull * mod - l[i] - r[i]) % mod;
  return res;
}

int main() {
  cin.tie(0)->sync_with_stdio(0);
  for (int i = 1; i < N; ++i) inv[i] = inv_(i);
  int n; cin >> n;
  int c0[C]{}, cnt[C]{};
  for (int i = 0, x; i < n; ++i) cin >> x, ++c0[x], cnt[x - !!x] += !!x;
  for (int i = C; --i; ) cnt[i - 1] += cnt[i];
  vector<poly> cont{{1}, {0}}, nx;
  for (int i = 1; i < n; ++i) {
    poly pp;
    for (int i = 0; auto& p: cont) {
      p = ade(p);
      uint64_t s = 0;
      for (auto& x: pp) s += x;
      pp.resize(max(pp.size(), p.size()));
      for (int i = 0; i < p.size(); ++i) pp[i] = add(+p[i], mod - pp[i]);
      for (int i = p.size(); i < pp.size(); ++i) pp[i] = mod - pp[i];
      add(pp[0], s % mod);
      nx.push_back(move(pp));
      swap(pp, p);
    }
    nx.push_back({0});
    swap(cont = {}, nx);
  }
  vector<int> e(n);
  for (int i = 0; i < n; ++i) e[i] = add(eval(ade(cont[i]), 1), e[i - !!i]);
  int ans = 0;
  vector<poly> coef;
  for (int c = 0; c < C; ++c) if (cnt[c]) {
    poly cur{1};
    for (int j = cnt[c]; j--; ) {
      cur.push_back(0);
      for (int i = 0, p = 0, t; i < cur.size(); ++i) t = p, p = cur[i], cur[i] = mul(t + p, mod / 2 + 1);
    }
    coef.push_back(cur);
  }
  for (int c = C; c--; ) if (c0[c]) {
    vector<int> dens{{1}}, ndens;
    int64_t mins = 1 - (1ll << c), maxs = n - 2 + mins, L = 0;
    for (int i = C; i--; ) maxs += 1ll * cnt[i] << i;
    int cans = 0;
    for (int i = C; i--; ) if (cnt[i]) {
      for (auto& x: dens) ndens.push_back(x), ndens.push_back(0);
      swap(dens = {}, ndens);
      dens.pop_back();
      L *= 2;
      dens = ksb(dens, coef[i]);
      maxs -= 0ll + cnt[i] - (i < c) << i;
      mins += 0ll + (i < c) << i;
      L -= i < c;
      while (-L > maxs >> i) add(cans, dens[0]), dens.erase(dens.begin()), ++L;
      while ((int)dens.size() + L - 1 > -mins >> i) dens.pop_back();
    }
    for (int i = 0; L <= 0; ++i) add(cans, mul(+dens[i], e[-L++]));
    add(ans, mul(cans, c0[c]));
  }
  cout << add(1, mod - ans) << '\n';
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 1ms
memory: 3624kb

input:

3
0 2 0

output:

166666668

result:

ok 1 number(s): "166666668"

Test #2:

score: 0
Accepted
time: 0ms
memory: 3484kb

input:

3
0 0 0

output:

500000004

result:

ok 1 number(s): "500000004"

Test #3:

score: 0
Accepted
time: 0ms
memory: 3616kb

input:

3
5 6 7

output:

208333335

result:

ok 1 number(s): "208333335"

Test #4:

score: 0
Accepted
time: 0ms
memory: 3564kb

input:

3
0 25 50

output:

889268532

result:

ok 1 number(s): "889268532"

Test #5:

score: 0
Accepted
time: 1ms
memory: 3560kb

input:

10
39 11 25 1 12 44 10 46 27 15

output:

913863330

result:

ok 1 number(s): "913863330"

Test #6:

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

input:

57
43 22 3 16 7 5 24 32 25 16 41 28 24 30 28 10 32 48 41 43 34 37 48 34 3 9 21 41 49 25 2 0 36 45 34 33 45 9 42 29 43 9 38 34 44 33 44 6 46 39 22 36 40 37 19 34 3

output:

400729664

result:

ok 1 number(s): "400729664"

Test #7:

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

input:

100
44 32 6 6 6 44 12 32 6 9 23 12 14 23 12 14 23 49 6 14 32 23 49 9 32 24 23 6 32 6 49 23 12 44 24 9 14 6 24 44 24 23 44 44 49 32 49 12 49 49 24 49 12 23 3 14 6 3 3 6 12 3 49 24 49 24 24 32 23 32 49 14 3 24 49 3 32 14 44 24 49 3 32 23 49 44 44 9 23 14 49 9 3 6 44 24 3 3 12 44

output:

32585394

result:

ok 1 number(s): "32585394"

Test #8:

score: 0
Accepted
time: 894ms
memory: 12484kb

input:

1000
2 27 0 0 27 0 2 0 27 0 27 27 0 0 0 0 0 2 0 27 0 2 2 0 27 27 0 0 0 27 2 2 2 27 0 2 27 2 0 2 27 0 0 27 0 27 0 0 27 2 27 2 2 27 2 27 0 0 27 0 27 0 2 27 2 2 0 27 27 27 27 0 27 0 27 0 2 2 0 2 2 27 0 0 27 0 0 27 0 2 27 27 2 27 2 0 0 2 27 27 27 27 27 27 2 2 0 2 2 0 2 2 0 27 0 27 2 2 0 27 27 0 0 27 2 2...

output:

94588769

result:

ok 1 number(s): "94588769"

Test #9:

score: 0
Accepted
time: 1620ms
memory: 12636kb

input:

1000
40 14 47 3 32 18 3 49 22 23 32 18 23 24 18 32 23 39 32 27 49 49 22 50 50 22 23 47 14 47 50 32 22 24 49 49 18 22 18 22 50 3 32 47 40 3 39 22 24 47 32 49 49 22 32 39 14 49 39 3 32 22 24 18 39 49 24 18 40 23 23 49 39 39 18 39 27 49 14 27 27 14 18 24 39 22 40 50 18 18 18 39 39 18 23 23 22 3 49 47 2...

output:

626481946

result:

ok 1 number(s): "626481946"

Test #10:

score: 0
Accepted
time: 1700ms
memory: 12424kb

input:

1000
28 32 35 9 21 11 43 23 45 15 23 2 8 3 39 41 31 9 45 35 27 14 40 28 31 9 31 9 9 40 8 6 27 43 3 27 23 49 27 6 28 25 11 9 15 27 38 27 12 28 25 2 15 27 45 6 27 1 21 38 1 25 27 21 49 31 31 14 39 39 8 39 40 28 15 31 21 14 43 38 11 8 8 23 9 11 15 2 11 39 32 14 28 15 40 49 27 9 23 9 9 6 21 2 2 1 14 11 ...

output:

644443122

result:

ok 1 number(s): "644443122"

Test #11:

score: 0
Accepted
time: 2605ms
memory: 11704kb

input:

972
39 15 23 0 40 29 43 47 6 9 30 9 2 8 19 9 45 25 26 38 33 18 6 33 44 48 24 8 4 16 33 42 33 31 36 33 13 16 3 12 21 19 1 30 24 23 43 35 0 33 31 32 23 31 36 12 26 0 29 48 28 33 28 28 3 49 9 5 29 8 29 28 49 41 33 49 5 49 6 9 50 25 39 11 1 36 6 44 10 34 32 31 25 31 36 36 3 9 50 35 47 43 25 46 30 18 5 2...

output:

684920840

result:

ok 1 number(s): "684920840"

Test #12:

score: 0
Accepted
time: 33ms
memory: 4136kb

input:

147
34 47 42 23 46 3 41 9 15 42 21 32 24 1 19 46 29 35 38 20 2 43 36 47 19 23 20 9 6 28 48 46 45 21 19 41 31 36 50 7 11 25 0 43 38 46 21 2 26 40 32 14 45 35 47 21 13 26 26 30 3 36 35 45 36 21 21 25 2 40 35 50 23 3 16 44 40 42 6 37 36 19 20 14 30 47 13 49 47 45 26 12 15 21 42 30 19 5 21 9 28 8 3 34 4...

output:

972735235

result:

ok 1 number(s): "972735235"

Test #13:

score: 0
Accepted
time: 2769ms
memory: 12496kb

input:

1000
36 15 9 5 35 37 17 30 24 13 18 32 14 35 36 26 23 7 21 15 43 15 21 11 33 33 9 16 5 26 1 45 48 27 20 20 20 48 42 27 22 7 39 35 11 38 33 47 22 34 43 4 32 0 47 35 48 8 9 3 40 3 27 22 20 43 12 37 30 18 2 37 37 35 44 3 42 14 20 24 44 5 17 38 46 41 28 23 21 7 13 15 35 38 21 14 6 37 37 6 13 34 32 13 23...

output:

179933029

result:

ok 1 number(s): "179933029"

Test #14:

score: 0
Accepted
time: 2771ms
memory: 12612kb

input:

1000
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7...

output:

540327646

result:

ok 1 number(s): "540327646"

Test #15:

score: 0
Accepted
time: 2741ms
memory: 12456kb

input:

1000
50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 4...

output:

169647494

result:

ok 1 number(s): "169647494"

Test #16:

score: -100
Time Limit Exceeded

input:

1000
11 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 40 50 50 50 50 50 21 50 12 50 50 50 50 50 0 50 50 50 38 50 50 50 50 50 50 25 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 7 50 50 50 50 50 50 50 50 ...

output:


result: