QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#449136 | #8526. Polygon II | ucup-team3215 | TL | 2771ms | 12636kb | C++20 | 3.9kb | 2024-06-20 18:35:22 | 2024-06-20 18:35:22 |
Judging History
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';
}
詳細信息
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 ...