题解:P6657 【模板】LGV 引理

\(\text{Part0.}\) 前置知识

对于一个 \(1\sim n\) 的排列 \(\sigma\),我们定义 \(\tau(\sigma)\) 为这个排列的逆序对个数。若 \(\tau(\sigma)\) 为奇数,则 \(\sigma\) 为奇排列,否则为偶排列。

对于一个 \(n \times n\)\(n\) 阶方阵 \(A = \begin{bmatrix} a_{1,1} & a_{1,2} & \cdots & a_{1,n} \\a_{2,1} & a_{2,2} & \cdots & a_{2,n} \\\vdots & \vdots & \ddots & \vdots \\a_{n,1} & a_{n,2} & \cdots & a_{n,n}\end{bmatrix}\)。则定义其行列式 \(\det(A) = \sum_{1 \sim n 的排列 \sigma} (-1)^{\tau(\sigma)} \prod^n_{i=1} a_{i,\sigma(i)}\)

如果需要知道如何快速求出这个行列式,请出门右转

\(\text{Part1.LGV}\) 引理

使用场景:LGV 适用于有边权(重边)的 DAG 上,对给定起点集合与终点集合之间的不相交的简单路径组计数。

定义和声明

路径的权值:

对于一条 \(p:s \to t\) 的路径 \(s = u_1,u_2 \cdots u_k = t\),路径的权值 \(\omega(P)\) 就是路径上的边权之积。如果是重边场景,可以认为边权就是重边的数量。

定义 \(e(u,v)\) 表示所有从 \(u\)\(v\) 所有的路径权值之和,即:

\[e(u,v) = \sum_{p:u \to v} \omega(p) \]

如果是重边场景,\(e(u,v)\) 实际上就是 \(u\)\(v\) 的路径方案数。

路径组:

给定大小均为 \(n\) 的起点集合 \(A\) 和起点集合 \(B\),满足 \(A\)\(b\) 不交,且 \(2n\) 不大于总点数 \(|V|\)

接下来需要找到一个 \(1 \sim n\) 的排列 \(\omega\),让 和 \(a_i\)\(b_i\) 一一对应。

然后为每对 \((a_i,b_i)\) 找到一条路径 \(p_i:a_i \to b_i\),从而构成了一个 \(A \to B\) 的路径组 \(P = (p_1,p_2,\cdots ,p_n)\)

而定义 \(\omega(P) = \prod^n_{i=1} \omega(p_i)\)。在重边场景下可以理解为是路径组的路径方案数。

对于 \(P\),我们设 \(\tau(p) = \tau(\omega)\)

假设 \(P\) 中有两条路径 \(p_i\)\(p_j\) 有公共交点,则称 \(P\) 为相交路径组。否则为不相交路径组。

矩阵和 LGV 引理

定义一个矩阵 \(M\) 为:

\[\begin{bmatrix} e(a_1,b_1) & e(a_1,b_2) & \cdots & e(a_1,b_n) \\ e(a_2,b_1) & e(a_2,b_2) & \cdots & e(a_2,b_n) \\ \vdots & \vdots & \ddots & \vdots \\ e(a_n,b_1) & e(a_n,b_2) & \cdots & e(a_n,b_n) \end{bmatrix} \]

那么我们的 LGV 引理说的就是:

\[\det(M) = \sum_{不相交的路径组 P} (-1)^{\tau(p)} \omega(p) \]

其实际意义为 \(\det(M)\) 是所有不相交路径组的方案数的带符号和。

证明

首先根据定义,我们有:

\[\det(M) = \sum_{\sigma} (-1)^{\tau(\sigma)} \prod^n_{i=1} \sum_{p:a_i \to b_i}\omega(p) \]

注意到:

\[\sum_{\sigma}(-1)^{\tau(\sigma)}\prod^n_{i=1}\sum_{p:a_i\to b_i} \omega(p) = \sum_{P:A \to B} (-1)^{\tau(P)} \omega(P) \]

即:\(\det(M) = \sum_{P : A \to B} (-1)^{\tau(p)}\omega(P)\),表示所有路径组的方案数的带符号和。

那么我们的 LGV 引理其实也说明了所有相交路径组的带符号和等于零。那么我们现在考虑如何证明这个东西。

对于一个相交路径组 \(P\),找到 \(P\) 当中最小的一对 \((i,j)\),满足 \(p_i\)\(p_j\) 相交,那么不妨设 \(p_i\)\(p_j\) 首次相交 \(x\) 于点。即 \(p_i : a_i \to x \to b_{\sigma_i},p_j : a_j \to x \to b_{\sigma_j}\)

考虑交换 \(\sigma_i\)\(\sigma_j\)。得到一个新的路径组 \(P^{\prime}\)

可以发现,如果交换 \(x\) 往后那一段,变为 \(a_i \to x \to b_{\sigma_j}\)\(a_j \to x \to b_{\sigma_i}\),这种情况是被包含在了 \(P^{\prime}\) 中的。

如果我们对 \(P^{\prime}\) 也按照这种方式变换,也会得到 \(P\) 因此他们是成对出现的。同时 \(P^{\prime}\)\(P\) 的权值总是只相差一个符号,所以所有相交路径组的带符号和等于零。证毕。

回归本题

题目链接

看到了 \(1 \le a_1 \le a_2 \le \cdots \le a_m \le n,1 \le b_1 \le b_2 \le \cdots \le b_m \le n\)。假设路径为 \(P\),那么一定有 \(\tau(P)\) 等于 \(0\)

\(e(a_i,b_j)\) 就是从 \((1,a_1)\)\((a_j,b_j)\) 的方案数,即 \(\dbinom{n-1+b_j-a_i}{n-1}\)。然后直接套板子即可。

#include<bits/stdc++.h>
#define int long long
using namespace std;

const int maxn = 5e6 + 10;
const int maxm = 505;
const int mod = 998244353;
int qpow(int a,int b)
{
    int res = 1;
    while(b)
    {
        if(b & 1)res = res * a % mod;
        a = a * a % mod;b >>= 1;
    }
    return res;
}
int n,m,a[maxm],b[maxm],inv[maxn],fac[maxn],dp[maxm][maxm];
int C(int n,int m){if(n < m)return 0;return fac[n] * inv[m] % mod * inv[n - m] % mod;}
void solve()
{
    cin >> n >> m;
    for(int i = 1;i <= m;i++)cin >> a[i] >> b[i];
    for(int i = 1;i <= m;i++)for(int j = 1;j <= m;j++)dp[i][j] = C(b[j] - a[i] + n - 1,n - 1);
    int w = 1;
    for(int i = 1;i <= m;i++)
    {
        for(int j = i + 1;j <= m;j++)
        {
            while(dp[i][i])
            {
                int s = dp[j][i] / dp[i][i];
                for(int k = i;k <= m;k++)dp[j][k] = (dp[j][k] - s * dp[i][k] % mod + mod) % mod;
                w = -w;swap(dp[i],dp[j]);
            }
            w = -w;swap(dp[i],dp[j]);
        }
    }
    int ans = 1;
    for(int i = 1;i <= m;i++)ans = ans * dp[i][i] % mod;
    cout << (ans * w % mod + mod) % mod << '\n';
}

signed main()
{
    fac[0] = 1;
    for(int i = 1;i <= 5000000;i++)fac[i] = fac[i - 1] * i % mod;
    inv[5000000] = qpow(fac[5000000],mod - 2);
    for(int i = 4999999;i >= 0;i--)inv[i] = inv[i + 1] * (i + 1) % mod;
    int T;cin >> T;while(T--)solve();
    return 0;
}

练习题:CF348D Turtles

posted @ 2025-07-26 07:57  sqrtqwq  阅读(21)  评论(0)    收藏  举报