[atAGC056F]Degree Sequence in DFS Order

(以下图默认均为$n$个点$,m$条边$,$无自环的无向连通图)

注意到点编号并没有意义,不妨强制dfs序为$\{1,2,...,n\}$,那么$\{a_{i}\}$合法等价于存在图$G$使得点$i$的度数为$a_{i}$且存在一种dfs序为$\{1,2,...,n\}$

称满足后者的图为"好图",称$\forall i\in [2,n]$存在$j\in [1,i)$与$i$相邻的图为"半好图",显然"好图"总是"半好图"

结论1:对于半好图$G$,存在好图$G'$使得$G$与$G'$所有点度数均相同

对于$G$中$1\le a<b<c<d\le n$使得$(a,c),(b,d)\in E$,不妨删除$(a,c)$和$(b,d)$并加入$(a,d)$和$(b,c)$,重复此过程直至不存在这样的$a,b,c$和$d$

考虑$\sum_{(x,y)\in E}(y-x)^{2}$,注意到每次操作后该值单调递增且有$mn^{2}$这个上界,因此过程有限

对于最终得到的图为$G'$,不难证明其符合条件,即得证

换言之,不妨将$\{a_{i}\}$合法的条件中"$G$为好图"改为"$G$为半好图"

结论2:$\{a_{i}\}$合法当且仅当满足以下条件:

1.$\forall i\in [1,n],a_{i}\in Z^{+}$且$\sum_{i=1}^{n}a_{i}=2m$

2.$a_{1}\le m$且$\forall i\in [2,n],a_{i}\le m-(i-2)$

3.$\forall i\in [0,n),\sum_{j=1}^{i}a_{j}\ge 2i-1$

必要性:

1.关于第1个条件,两者均显然成立(前者对$i$是否为1分类讨论即可)

2.关于第2个条件,$[2,i)$这些点均要"向前"连一条边,进而$i$至多连$m-(i-2)$条边

另外,由于没有自环,显然有$a_{1}\le m$(上式仅得到$a_{1}\le m+1$)

3.关于第3个条件,$[1,i]$这些点内部有$2(i-1)$条边且$i+1$至少再连一条边,进而度数和$\ge 2i-1$

充分性:

对于$i\in [2,n]$,依次选择当前最大的$a_{j}$(其中$j\in [1,i)$,多个任选)并连边$(i,j)$(将$a_{i}$和$a_{j}$均减1)

此时即保证是"半好图",进而仅需要保证$a_{i}\in [0,m']$且$\sum_{i=1}^{n}a_{i}=2m'$(其中$m'$为剩余边数)

1.对于$a_{i}\ge 0$,也即每一次$a_{i},a_{j}\ge 1$,$a_{i}$是第一次操作根据$a_{i}\in Z^{+}$显然,若$a_{j}=0$即$\sum_{j=1}^{i-1}a_{j}=0$,由于之前已经选了$i-1$条边,可得初始$\sum_{j=1}^{i-1}a_{j}\le 2i-2$,与3矛盾

2.对于$a_{i}\le m'$,若存在$a_{j}>m'$,则在$i\in (j,n]$时必然都选该$a_{j}$(若还操作过$k$,最终$a_{k}\ge a_{j}-1$,那么$a_{j}+a_{k}>2m'$与3矛盾),而其仍然$>m'$,与2矛盾

3.对于$\sum_{i=1}^{n}a_{i}=2m'$,根据初始$\sum_{i=1}^{n}a_{i}=2m$显然成立

进一步的,构造$b_{i}=\begin{cases}a_{1}&(i=0)\\a_{i+1}-1&(1\le i<n)\end{cases}$

对于$b_{i}$而言,结论2中的条件即等价于:

1.$\forall i\in [0,n),b_{i}\in N$且$\sum_{i=0}^{n-1}b_{i}=2m-(n-1)$

2.$\forall i\in [0,n),b_{i}\le m-i$

3.$\forall i\in [0,n),\sum_{j=0}^{i-1}b_{j}\ge i$

(关于$b_{0}=a_{1}\in Z^{+}$的条件已经在3中保证)

结论3:在保证第1和3个条件的基础上,至多存在一个$i$不满足第2个条件

反证法,若存在$x<y$均不满足,则$x\le \sum_{j=0}^{x-1}b_{j}\le \sum_{i=0}^{n-1}b_{i}-b_{x}-b_{y}\le x+y-n-1$,再移项后即$y\ge n+1$,矛盾

换言之,先忽略第2个条件,再枚举对应的$i$减去不满足第2个条件的方案

关于前半部分,即求$(0,0)\rightarrow (n-1,2m-(n-1))$(仅能向上或向右)且不经过$y<x$的路径数

类似卡特兰数的推导,将第一处经过后的部分沿$y=x-1$​翻折,翻折后的终点即$(2m-(n-2),n-2)$,经过该处必然经过$y<x$,因此答案为${2m\choose n-1}-{2m\choose n-2}$

关于后半部分,将$b_{i}$减去$m-i+1$,第1个条件变为$\sum_{i=0}^{n-1}b_{i}=m-n+i$,且$i$之后第3个条件必然成立

特判$i=0$的情况,此时答案显然为${m-1\choose n-1}$

对于$i\ge 1$的情况,考虑路径中第一次经过$(*,i)$的位置,并枚举第一维$k\in [0,i)$,之后的路径即没有限制,结合前者对应答案即为$\left({k+i-1\choose k}-{k+i-1\choose k-1}\right){m-k-1\choose m-n}$

调换两者枚举顺序,右式与$i$无关,左式根据$\sum_{i=l}^{r}{i\choose k}={r+1\choose k+1}-{l\choose k+1}$可以$o(1)$计算

时间复杂度为$o(m)$,可以通过

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define N 2000005
 4 #define mod 998244353
 5 #define ll long long
 6 int n,m,ans,fac[N],inv[N];
 7 int C(int n,int m){
 8     if ((m<0)||(n<m))return 0;
 9     return (ll)fac[n]*inv[m]%mod*inv[n-m]%mod;
10 }
11 int main(){
12     scanf("%d%d",&n,&m);
13     fac[0]=inv[0]=inv[1]=1;
14     for(int i=1;i<N;i++)fac[i]=(ll)fac[i-1]*i%mod;
15     for(int i=2;i<N;i++)inv[i]=(ll)(mod-mod/i)*inv[mod%i]%mod;
16     for(int i=1;i<N;i++)inv[i]=(ll)inv[i-1]*inv[i]%mod;
17     ans=(C((m<<1),n-1)-C((m<<1),n-2)+mod)%mod;
18     ans=(ans-C(m-1,n-1)+mod)%mod;
19     for(int k=0;k<n;k++){
20         int s=(C(k+n-1,k+1)-C((k<<1),k+1)+mod)%mod;
21         s=(s-(C(k+n-1,k)-C((k<<1),k)+mod)%mod)%mod;
22         ans=(ans-(ll)s*C(m-k-1,m-n)%mod+mod)%mod;
23     }
24     printf("%d\n",ans);
25     return 0;
26 } 
View Code

 

posted @ 2021-12-11 22:40  PYWBKTDA  阅读(122)  评论(0编辑  收藏  举报