QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#454840 | #8526. Polygon II | karuna | WA | 11ms | 3932kb | C++20 | 2.2kb | 2024-06-25 15:13:51 | 2024-06-25 15:13:51 |
Judging History
answer
#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
#pragma GCC target("avx,avx2,fma")
#define ff first
#define ss second
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
const int MOD = 1e9 + 7;
const int SZ = 1020;
const int BW = 60;
struct mint {
int x;
mint() : x(0) {}
mint(int x) : x(x) {}
mint operator+(const int &ot) const { return x + ot >= MOD ? x + ot - MOD : x + ot; }
mint operator-(const int &ot) const { return x < ot ? x - ot + MOD : x - ot; }
mint operator*(const int &ot) const { return 1ll * x * ot % MOD; }
mint operator+=(int ot) { return *this = *this + ot; }
mint operator-=(int ot) { return *this = *this - ot; }
mint operator*=(int ot) { return *this = *this * ot; }
operator int() { return x; }
};
mint mpow(mint a, ll x) {
mint r = 1;
while (x) {
if (x & 1) r *= a;
a *= a;
x /= 2;
}
return r;
}
mint init_prb[SZ];
mint fac[SZ], ifac[SZ];
int n, a[SZ], cnt[BW], suf[BW];
mint dp[BW][SZ], ipw[SZ];
int main() {
cin.tie(0); ios_base::sync_with_stdio(0);
fac[0] = 1;
for (int i = 1; i < SZ; i++) fac[i] = fac[i - 1] * i;
ifac[SZ - 1] = mpow(fac[SZ - 1], MOD - 2);
for (int i = SZ - 1; i > 0; i--) ifac[i - 1] = ifac[i] * i;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> a[i];
cnt[a[i]]++;
}
for (int i = BW - 1; i > 0; i--) cnt[i - 1] += cnt[i];
for (int i = BW - 1; i > 0; i--) suf[i - 1] = suf[i] + cnt[i - 1];
// probability that x_1 + x_2 + ... + x_n <= k
for (int k = 0; k <= n; k++) {
for (int i = 0; i <= k; i++) {
init_prb[k] += mpow(k - i, n) * ifac[n - i] * ifac[i] * ((i & 1) ? MOD - 1 : 1);
}
}
for (int c = 0; c < n; c++) {
dp[0][c] = init_prb[c + 1] - init_prb[c];
}
mint i2 = mpow(2, MOD - 2);
ipw[0] = 1;
for (int i = 1; i < SZ; i++) ipw[i] = ipw[i - 1] * i2;
for (int s = 1; s < BW; s++) {
for (int c = 0; c < SZ; c++) {
for (int x = 0; x <= cnt[s]; x++) {
dp[s][(c + x) / 2] += dp[s - 1][c] * fac[cnt[s]] * ifac[x] * ifac[cnt[s] - x] * ipw[cnt[s]];
}
}
}
mint ans = 1;
for (int i = 0; i < n; i++) {
ans -= dp[a[i]][0] * ipw[suf[a[i] + 1]];
}
cout << ans << '\n';
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 1ms
memory: 3776kb
input:
3 0 2 0
output:
166666668
result:
ok 1 number(s): "166666668"
Test #2:
score: 0
Accepted
time: 1ms
memory: 3704kb
input:
3 0 0 0
output:
500000004
result:
ok 1 number(s): "500000004"
Test #3:
score: 0
Accepted
time: 1ms
memory: 3772kb
input:
3 5 6 7
output:
208333335
result:
ok 1 number(s): "208333335"
Test #4:
score: 0
Accepted
time: 1ms
memory: 3812kb
input:
3 0 25 50
output:
889268532
result:
ok 1 number(s): "889268532"
Test #5:
score: 0
Accepted
time: 2ms
memory: 3932kb
input:
10 39 11 25 1 12 44 10 46 27 15
output:
913863330
result:
ok 1 number(s): "913863330"
Test #6:
score: -100
Wrong Answer
time: 11ms
memory: 3808kb
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:
897660750
result:
wrong answer 1st numbers differ - expected: '400729664', found: '897660750'