Loading docs/graph/lgv.md +59 −70 Original line number Diff line number Diff line Loading @@ -56,7 +56,6 @@ $$ #include <algorithm> #include <cstdio> typedef long long ll; const int K = 105; Loading @@ -65,64 +64,54 @@ $$ int T, n, k, a[K], b[K], fact[N << 1], m[K][K]; int qpow(int x, int y) { int qpow(int x, int y) { int out = 1; while (y) { while (y) { if (y & 1) out = (ll)out * x % mod; x = (ll)x * x % mod; y >>= 1; } return out; } int c(int x, int y) { return (ll) fact[x] * qpow(fact[y], mod - 2) % mod * qpow(fact[x - y], mod - 2) % mod; int c(int x, int y) { return (ll)fact[x] * qpow(fact[y], mod - 2) % mod * qpow(fact[x - y], mod - 2) % mod; } int main() { int main() { fact[0] = 1; for (int i = 1; i < N * 2; ++i) fact[i] = (ll)fact[i - 1] * i % mod; scanf("%d", &T); while (T--) { while (T--) { scanf("%d%d", &n, &k); for (int i = 1; i <= k; ++i) scanf("%d", a + i); for (int i = 1; i <= k; ++i) scanf("%d", b + i); for (int i = 1; i <= k; ++i) { for (int j = 1; j <= k; ++j) { if (a[i] <= b[j]) m[i][j] = c(b[j] - a[i] + n - 1, n - 1); else m[i][j] = 0; for (int i = 1; i <= k; ++i) { for (int j = 1; j <= k; ++j) { if (a[i] <= b[j]) m[i][j] = c(b[j] - a[i] + n - 1, n - 1); else m[i][j] = 0; } } for (int i = 1; i < k; ++i) { if (!m[i][i]) { for (int j = i + 1; j <= k; ++j) { if (m[j][i]) { for (int i = 1; i < k; ++i) { if (!m[i][i]) { for (int j = i + 1; j <= k; ++j) { if (m[j][i]) { std::swap(m[i], m[j]); break; } } } if (!m[i][i]) continue; for (int j = i + 1; j <= k; ++j) { for (int j = i + 1; j <= k; ++j) { if (!m[j][i]) continue; int mul = (ll)m[j][i] * qpow(m[i][i], mod - 2) % mod; for (int p = i; p <= k; ++p) { for (int p = i; p <= k; ++p) { m[j][p] = (m[j][p] - (ll)m[i][p] * mul % mod + mod) % mod; } } Loading Loading
docs/graph/lgv.md +59 −70 Original line number Diff line number Diff line Loading @@ -56,7 +56,6 @@ $$ #include <algorithm> #include <cstdio> typedef long long ll; const int K = 105; Loading @@ -65,64 +64,54 @@ $$ int T, n, k, a[K], b[K], fact[N << 1], m[K][K]; int qpow(int x, int y) { int qpow(int x, int y) { int out = 1; while (y) { while (y) { if (y & 1) out = (ll)out * x % mod; x = (ll)x * x % mod; y >>= 1; } return out; } int c(int x, int y) { return (ll) fact[x] * qpow(fact[y], mod - 2) % mod * qpow(fact[x - y], mod - 2) % mod; int c(int x, int y) { return (ll)fact[x] * qpow(fact[y], mod - 2) % mod * qpow(fact[x - y], mod - 2) % mod; } int main() { int main() { fact[0] = 1; for (int i = 1; i < N * 2; ++i) fact[i] = (ll)fact[i - 1] * i % mod; scanf("%d", &T); while (T--) { while (T--) { scanf("%d%d", &n, &k); for (int i = 1; i <= k; ++i) scanf("%d", a + i); for (int i = 1; i <= k; ++i) scanf("%d", b + i); for (int i = 1; i <= k; ++i) { for (int j = 1; j <= k; ++j) { if (a[i] <= b[j]) m[i][j] = c(b[j] - a[i] + n - 1, n - 1); else m[i][j] = 0; for (int i = 1; i <= k; ++i) { for (int j = 1; j <= k; ++j) { if (a[i] <= b[j]) m[i][j] = c(b[j] - a[i] + n - 1, n - 1); else m[i][j] = 0; } } for (int i = 1; i < k; ++i) { if (!m[i][i]) { for (int j = i + 1; j <= k; ++j) { if (m[j][i]) { for (int i = 1; i < k; ++i) { if (!m[i][i]) { for (int j = i + 1; j <= k; ++j) { if (m[j][i]) { std::swap(m[i], m[j]); break; } } } if (!m[i][i]) continue; for (int j = i + 1; j <= k; ++j) { for (int j = i + 1; j <= k; ++j) { if (!m[j][i]) continue; int mul = (ll)m[j][i] * qpow(m[i][i], mod - 2) % mod; for (int p = i; p <= k; ++p) { for (int p = i; p <= k; ++p) { m[j][p] = (m[j][p] - (ll)m[i][p] * mul % mod + mod) % mod; } } Loading