QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#224937#7613. Inverse Problemucup-team1209WA 6765ms474244kbC++203.6kb2023-10-23 18:05:102023-10-23 18:05:12

Judging History

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

  • [2023-10-23 18:05:12]
  • 评测
  • 测评结果:WA
  • 用时:6765ms
  • 内存:474244kb
  • [2023-10-23 18:05:10]
  • 提交

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)