QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#246444 | #7613. Inverse Problem | JWRuixi | AC ✓ | 26041ms | 140216kb | C++23 | 4.7kb | 2023-11-10 20:27:15 | 2023-11-10 20:28:33 |
Judging History
answer
#include <bits/stdc++.h>
#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,avx2")
// #define ATC
#define LL long long
#define eb emplace_back
#define writesp(x) write(x), putchar(' ')
#define writeln(x) write(x), putchar('\n')
#define FIO(FILENAME) freopen(FILENAME".in", "r", stdin), freopen(FILENAME".out", "w", stdout)
using namespace std;
#ifdef ATC
#include <atcoder/all>
using namespace atcoder;
#endif
namespace IO {
char ibuf[(1 << 20) + 1], *iS, *iT;
#if ONLINE_JUDGE
#define gh() (iS == iT ? iT = (iS = ibuf) + fread(ibuf, 1, (1 << 20) + 1, stdin), (iS == iT ? EOF : *iS++) : *iS++)
#else
#define gh() getchar()
#endif
inline long long read() {
char ch = gh();
long long x = 0;
bool t = 0;
while (ch < '0' || ch > '9') t |= ch == '-', ch = gh();
while (ch >= '0' && ch <= '9') x = (x << 1) + (x << 3) + (ch ^ 48), ch = gh();
return t ? ~(x - 1) : x;
}
template<typename _Tp>
inline void write(_Tp x) {
static char stk[64], *top = stk;
if (x < 0) {
x = ~(x - 1);
putchar('-');
}
do *top++ = x % 10, x /= 10;
while (x);
while (top != stk) putchar((*--top) | 48);
}
}
using IO::read;
using IO::write;
using pii = pair<int, int>;
using vi = vector<int>;
#define fi first
#define se second
#define MP make_pair
constexpr int N = 1 << 7, M = 12, mod = 1e9 + 7, B = 5;
int T, fac[N], ifac[N], inv[N];
bitset<mod> s;
vector<pii> q;
vi as[M];
inline int ksm (int b, int k) {
int r = 1;
for (; k; k >>= 1, b = (LL)b * b % mod) if (k & 1) r = (LL)r * b % mod;
return r;
}
inline int Binom (int i, int j) {
if (i < j || i < 0 || j < 0) return 0;
return (LL)fac[i] * ifac[j] % mod * ifac[i - j] % mod;
}
void init () {
fac[0] = 1;
for (int i = 1; i < N; i++) fac[i] = (LL)fac[i - 1] * i % mod;
ifac[N - 1] = ksm(fac[N - 1], mod - 2);
for (int i = N - 2; ~i; i--) ifac[i] = (LL)ifac[i + 1] * (i + 1) % mod;
for (int i = 1; i < N; i++) inv[i] = (LL)ifac[i] * fac[i - 1] % mod;
}
int v[N], iv[N], stk[N];
vi L, R;
bool fl;
int Goal;
vi P;
inline void dfsL (int d, int l, int u, int ml) {
if (!u) {
if (fl) {
if (ml == Goal) {
for (int i = 0; i < d; i++) P.eb(stk[i]);
}
return;
}
L.eb(ml);
return;
}
for (int i = 1; i <= min(l, u); i++) {
stk[d] = i;
dfsL(d + 1, i, u - i, (LL)ml * iv[i] % mod);
}
}
inline void dfsR (int d, int l, int u, int ml) {
if (!u) {
if (fl) {
if (ml == Goal) {
for (int i = 0; i < d; i++) P.eb(stk[i]);
}
return;
}
R.eb(ml);
return;
}
for (int i = l; i <= u; i++) {
stk[d] = i;
dfsR(d + 1, i, u - i, (LL)ml * v[i] % mod);
}
}
inline void BF (int n) {
if (q.empty()) return;
int o = n * (n - 1);
o = ksm(o, mod - 2);
for (int i = 1; i < n - 1; i++) {
v[i] = (LL)fac[n - 2] * ifac[n - 2 - i] % mod;
iv[i] = (LL)ifac[n - 2] * fac[n - 2 - i] % mod;
}
for (int i = 0; i < n - 1; i++) {
if (q.empty()) return;
vi().swap(L), vi().swap(R);
dfsL(0, B, i, 1);
dfsR(0, B + 1, n - 2 - i, 1);
// cout << n << ' ' << i << ' ' << L.size() << ' ' << R.size() << '\n';
for (int j : R) s.set(j);
for (int j : L) {
for (int k = 0; k < q.size(); k++) {
auto [goal, id] = q[k];
goal = (LL)goal * o % mod * j % mod;
if (!s.test(goal)) continue;
fl = 1;
vi().swap(P);
Goal = j;
dfsL(0, B, i, 1);
as[id].insert(as[id].end(), P.begin(), P.end());
vi().swap(P);
Goal = goal;
dfsR(0, B + 1, n - 2 - i, 1);
fl = 0;
as[id].insert(as[id].end(), P.begin(), P.end());
as[id].resize(n);
q.erase(q.begin() + k);
--k;
}
}
for (int j : R) s.set(j, 0);
}
}
inline void __out (vector<int> v) {
cout << v.size() << '\n';
sort(v.begin(), v.end(), greater<>());
++v[0];
int s = 1;
for (int i = 0; i < v.size(); i++) {
for (int j = s; j < s + v[i]; j++) {
cout << (i + 1) << ' ' << (j + 1) << '\n';
}
s += v[i];
}
}
int main() {
cout.tie(0) -> sync_with_stdio(0);
T = read();
for (int i = 1; i <= T; i++) {
int r = read();
if (r == 1) {
as[i] = {-1};
continue;
}
q.eb(r, i);
}
init();
for (int i = 2; i < N; i++)
BF(i);
assert(q.empty());
for (int i = 1; i <= T; i++) {
__out(as[i]);
}
}
// I love WHQ!
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 0ms
memory: 3452kb
input:
4 2 360 1 509949433
output:
2 1 2 5 1 2 1 3 1 4 2 5 1 10 1 2 1 3 2 4 3 5 4 6 5 7 6 8 7 9 8 10
result:
ok OK (4 test cases)
Test #2:
score: 0
Accepted
time: 19781ms
memory: 140216kb
input:
9 185396120 468170792 837583517 696626231 338497514 762842660 800028852 928391161 733524004
output:
14 1 2 1 3 1 4 2 5 2 6 3 7 4 8 5 9 6 10 7 11 8 12 9 13 10 14 122 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 1 10 1 11 1 12 1 13 1 14 1 15 1 16 1 17 1 18 1 19 1 20 1 21 1 22 1 23 1 24 1 25 1 26 1 27 1 28 1 29 1 30 1 31 2 32 2 33 2 34 2 35 2 36 2 37 2 38 2 39 2 40 2 41 2 42 2 43 2 44 2 45 3 46 3 47 3 48 3 49 3 5...
result:
ok OK (9 test cases)
Test #3:
score: 0
Accepted
time: 26041ms
memory: 140204kb
input:
10 338497514 733524004 447182954 415993605 453460670 50499055 648088551 986982752 907925397 315315230
output:
124 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 1 10 1 11 1 12 1 13 1 14 1 15 1 16 1 17 1 18 1 19 1 20 1 21 1 22 1 23 1 24 1 25 1 26 1 27 1 28 1 29 1 30 1 31 1 32 1 33 1 34 1 35 1 36 2 37 2 38 2 39 2 40 2 41 2 42 2 43 2 44 2 45 2 46 2 47 2 48 2 49 2 50 2 51 3 52 3 53 3 54 3 55 3 56 3 57 3 58 3 59 3 60 4 61 4 62...
result:
ok OK (10 test cases)
Test #4:
score: 0
Accepted
time: 5159ms
memory: 127228kb
input:
10 1 2 3 4 5 6 7 8 9 10
output:
1 2 1 2 102 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 1 10 1 11 1 12 1 13 1 14 1 15 1 16 1 17 1 18 1 19 1 20 1 21 1 22 1 23 1 24 1 25 2 26 2 27 2 28 2 29 2 30 2 31 2 32 2 33 2 34 2 35 2 36 2 37 2 38 2 39 2 40 2 41 2 42 2 43 3 44 3 45 3 46 3 47 3 48 3 49 3 50 3 51 3 52 3 53 3 54 3 55 3 56 4 57 4 58 4 59 4 60 4...
result:
ok OK (10 test cases)
Test #5:
score: 0
Accepted
time: 1672ms
memory: 126012kb
input:
10 269199917 392009324 753889928 751355133 472639410 132096559 331333826 40414701 72847302 475706026
output:
55 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 1 10 1 11 1 12 1 13 1 14 1 15 1 16 1 17 1 18 1 19 1 20 1 21 1 22 1 23 1 24 1 25 1 26 1 27 1 28 1 29 1 30 1 31 1 32 1 33 1 34 1 35 1 36 1 37 1 38 1 39 1 40 1 41 1 42 1 43 1 44 1 45 1 46 1 47 1 48 1 49 1 50 1 51 1 52 1 53 1 54 1 55 84 1 2 1 3 1 4 1 5 1 6 1 7 1 8 2 9 ...
result:
ok OK (10 test cases)
Extra Test:
score: 0
Extra Test Passed