QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#224937 | #7613. Inverse Problem | ucup-team1209 | WA | 6765ms | 474244kb | C++20 | 3.6kb | 2023-10-23 18:05:10 | 2023-10-23 18:05:12 |
Judging History
answer
#include<bits/stdc++.h>
using std::cin, std::cout;
const int N = 300;
const int mod = 1e9 + 7;
using u64 = unsigned long long;
int fac[N], inv[N], ifac[N];
int r[N];
std::vector<int> ans[N];
void output(std::vector<int> deg) {
cout << deg.size() << '\n';
for(int i = 1;i <= deg.size();++i) {
for(int j = 0;j < deg.size();++j) if(deg[j] == 1) {
-- deg[j];
int k = max_element(deg.begin(), deg.end()) - deg.begin();
--deg[k];
cout << j + 1 << ' ' << k + 1 << '\n';
}
}
}
struct bag {
std::vector<int> dp[N][N];
void clear(int n) {
for(int i = 0;i <= n;++i)
for(int j = 0;j <= n + n - 2;++j)
dp[i][j].clear();
}
void ins(int x, int n, int * f) {
for(int i = 0;i < n;++i) {
for(int j = 0;j + x + (n - i - 1) <= n + n - 2;++j) {
for(int w : dp[i][j]) {
dp[i + 1][j + x].push_back((u64) w * f[n - 1 - x] % mod);
}
}
}
}
void push(int l, int r, int cnt, int deg, int * f, int w, auto & d, int n) {
for(int s = l;cnt && s <= r;s += 1) {
for(;s <= deg && cnt;) {
auto & v = dp[cnt - 1][deg - s];
int nxt = (u64) w * f[n - 1 - s] % mod;
auto it = std::ranges::find(v, nxt);
if(it == v.end()) break;
d.push_back(s);
w = nxt;
cnt -= 1;
deg -= s;
}
}
}
} a[2];
int main() {
std::ios::sync_with_stdio(false), cin.tie(0);
fac[0] = ifac[0] = fac[1] = ifac[1] = inv[1] = 1;
for(int i = 2;i < N;++i) {
inv[i] = u64(mod - mod / i) * inv[mod % i] % mod;
fac[i] = (u64) fac[i - 1] * i % mod;
ifac[i] = (u64) ifac[i - 1] * inv[i] % mod;
}
int t; cin >> t;
for(int i = 0;i < t;++i) {
cin >> r[i];
if(r[i] == 1) {
ans[i] = {0};
}
}
for(int n = 2;;++n) {
a[0].dp[0][0] = {1};
a[1].dp[0][0] = {1};
int lim = std::max(n / 18, 1);
for(int i = 1;i <= lim;i += 1) {
a[0].ins(i, n, ifac);
}
for(int i = lim + 1;i < n;i += 1) {
a[1].ins(i, n, fac);
}
int ssize = 0;
int ssize1 = 0;
u64 su = 0;
u64 val = (u64) inv[n] * inv[n - 1] % mod;
for(int i = 0;i < n;++i) {
val = val * ifac[n - 2] % mod;
}
// std::vector<std::vector<int>> sorted(n + 1, std::vector<int>(n + n - 1));
for(int i = 0;i <= n;++i) {
for(int k = 0;k < t;++k) {
if(ans[k].size()) continue;
for(int j = 0;j <= n + n - 2;++j) {
auto & v = a[0].dp[n - i][n + n - 2 - j];
auto & v2 = a[1].dp[i][j];
if(!v.size()) continue;
if(!a[1].dp[i][j].size()) continue;
if(v.size() > v2.size()) {
std::ranges::sort(v);
u64 z = val * r[k] % mod;
for(int w : v2) {
u64 p = z * w % mod;
auto it = std::ranges::lower_bound(v, p);
if(it == v.end() || *it != p) continue;
a[0].push(1, lim, n - i, n + n - 2 - j, fac, p, ans[k], n);
a[1].push(lim + 1, n - 1, i, j, ifac, w, ans[k], n);
// std::cerr << "done " << '\n';
break;
}
} else {
std::ranges::sort(v2);
u64 z = val * r[k] % mod;
z = pow(z, mod - 2);
for(int w : v) {
u64 p = z * w % mod;
auto it = std::ranges::lower_bound(v2, p);
if(it == v.end() || *it != p) continue;
a[0].push(1, lim, n - i, n + n - 2 - j, fac, w, ans[k], n);
a[1].push(lim + 1, n - 1, i, j, ifac, p, ans[k], n);
// std::cerr << "done " << '\n';
break;
}
}
if(ans[k].size()) break;
}
}
}
// std::cerr << n << ' ' << ssize << ' ' << ssize1 << ' ' << su << std::endl;
a[0].clear(n);
a[1].clear(n);
int done = 1;
for(int i = 0;i < t;++i) {
done = done && ans[i].size();
}
if(done) {
break;
}
}
for(int i = 0;i < t;++i) {
output(ans[i]);
}
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 0
Wrong Answer
time: 6765ms
memory: 474244kb
input:
4 2 360 1 509949433
output:
2 1 2 102 1 102 2 102 3 102 4 102 5 100 6 101 7 102 8 100 9 101 10 102 11 100 12 101 13 102 14 99 15 100 16 101 17 102 18 99 19 100 20 101 21 102 22 99 23 100 24 101 25 102 26 98 27 99 28 100 29 101 30 102 31 93 32 94 33 95 34 96 35 97 36 98 37 99 38 100 39 101 40 102 41 87 42 88 43 89 44 90 45 91 4...
result:
wrong answer Jury znalazło mniejsze drzewo! (test case 2)