QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#449041#8526. Polygon IIucup-team3215TL 2870ms19320kbC++202.6kb2024-06-20 16:21:522024-06-20 16:21:52

Judging History

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

  • [2024-06-20 16:21:52]
  • 评测
  • 测评结果:TL
  • 用时:2870ms
  • 内存:19320kb
  • [2024-06-20 16:21:52]
  • 提交

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

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}};
  for (int i = 1; i < n; ++i) {
    vector<poly> nx;
    poly pp;
    for (int i = 0; auto& p: cont) p = ade(p), nx.push_back(dif(p, dif(pp, {eval(pp, 1)}))), pp = p;
    nx.push_back({0});
    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;
  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--; ) {
      for (auto& x: dens) ndens.push_back(x), ndens.push_back(0);
      swap(dens = {}, ndens);
      dens.pop_back();
      L *= 2;
      for (int j = cnt[i]; j--; ) {
        int64_t l = -(!j && i < c), r = j || i >= c;
        dens.push_back(0);
        for (int pp = 0; auto& p: dens) ndens.push_back(mul(pp + p, mod / 2 + 1)), pp = p;
        maxs -= r << i, mins -= l << i;
        L += l;
        swap(dens = {}, ndens);
        while (-L > maxs >> i) add(cans, dens[0]), dens.erase(dens.begin()), ++L;
        while ((int)dens.size() + L - 1 > -mins >> i) dens.pop_back();
      }
    }
    while (L <= 0) add(cans, mul(+dens[0], e[-L++])), dens.erase(dens.begin());
    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: 3844kb

input:

3
0 2 0

output:

166666668

result:

ok 1 number(s): "166666668"

Test #2:

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

input:

3
0 0 0

output:

500000004

result:

ok 1 number(s): "500000004"

Test #3:

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

input:

3
5 6 7

output:

208333335

result:

ok 1 number(s): "208333335"

Test #4:

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

input:

3
0 25 50

output:

889268532

result:

ok 1 number(s): "889268532"

Test #5:

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

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: 6ms
memory: 3736kb

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: 6ms
memory: 4144kb

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: 2033ms
memory: 19320kb

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: 2820ms
memory: 19256kb

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: 2870ms
memory: 19148kb

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

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:


result: