• [atAGC046F]Forbidden Tournament


    称满足第1个条件的图为竞赛图,先来分析竞赛图

    结论1:竞赛图点集上的导出子图也为竞赛图(证明略)

    结论2:对于一张竞赛图,若不含有3元环,则该图为DAG

    证明:反证法,若其不为DAG,设最小的简单环为$c_{1},c_{2},...,c_{k}$,必然有$kge 4$

    根据第1个条件,考虑$c_{1}$和$c_{3}$之间边的方向,不论怎样都会有更小的简单环,与假设矛盾,因此不存在简单环

    利用这个结论,来对$G$分类讨论:

    1.若存在$d$使得$d$入度为0,那么$d$出度必然为$n-1$,即考虑将$d$删除并令$n$和$k$减小1的子问题(由于$a,b,c,d$四个点的入度都不为0,不影响第3个条件)

    2.若所有点入度都不为0,任选一点$d$,令$V'={x|(x,d)in E}$,$V'$的导出子图不能含有3元环(否则三元环+$d$即不合法),则其为DAG

    令$V_{补}={x|(d,x)in E}$(注意$d otin V_{补}cup V'$),以下来证明$V_{补}$的导出子图也是一张DAG

    考虑$x,yin V_{补}$,不妨设边的方向为$(x,y)$,那么若存在$(x,z),(z,y)in E$,则$(x,z,d,y)$不合法,换一种方式来描述这个条件:设$S_{x}={z|zin V',(x,z)in E}$,则$S_{x}subseteq S_{y}$

    如果存在$x_{1},x_{2},x_{3}in V_{补}$构成了三元环,则$S_{x_{1}}=S_{x_{2}}=S_{x_{3}}=emptyset$(否则$(x_{1},x_{2},x_{3},zin S_{x_{1}})$不合法)

    再考虑一个点$x_{4}in V_{补}$,若不存在$(x_{4},x_{i})in E$(其中$i=1,2,3$),则$(x_{1},x_{2},x_{3},x_{4})$不合法,否则假设其所连的点为$x$,则$S_{x_{4}}subseteq S_{x}=emptyset$

    对于$V'$的导出子图中度为0的点$z$(由于是DAG,必然存在),$forall xin V_{补},(x,z) otin E$,因此$z$的入度为0,与‘所有点入度都不为0’矛盾,因此$V_{补}$中无三元环,即为DAG

    考虑$(x_{1},x_{2},y_{1},y_{2})$这种形式所构成的不合法(其中$x_{1},x_{2}in V'$且$(x_{1},x_{2})in E$,$y_{1},y_{2}$类似),利用上面$S_{x}$的条件,有$S_{y_{1}}subseteq S_{y_{2}}$

    对于$d=x_{2}$和$d=y_{2}$(这里的$d$指四元组中的$d$,下同)分类讨论,由于$x_{2}in S_{y_{1}}$且$ otin S_{y_{2}}$,后者是不合法的,因此考虑前者

    取$x_{2}in S_{y_{1}}$且$x_{1}in C_{(S_{y_{2}})}S_{y_{1}}$,若$(x_{1},x_{2})in E$一定不合法,因此$S_{y_{1}}$一定是$S_{y_{2}}$的一个‘前缀’(指在$V'$的拓扑序上)或$S_{y_{1}}$为空

    另外由于每一个点入度都不为0,令$x$为$V'$中拓扑序最小的,$y$为$V_{补}$中拓扑序最大的,必然有$xin S_{y}$,再结合上面的这个结论,有若$S_{y} eq emptyset$,则$xin S_{y}$

    再考虑$(x_{1},x_{2},x_{3},y)$这种形式的不合法($x_{i}in V'$且$(x_{1},x_{2}),(x_{2},x_{3})in E$,$yin V_{补}$),同样对$d=x_{3}$和$d=y$分类讨论,后者显然无法使$(x_{1},x_{2},x_{3})$构成三元环,因此考虑前者

    取$x_{1}$为字典序最小的位置,若$S_{y} eq empty$,则$x_{1}in S_{y}$,那么接下来不能存在$x_{2} otin S_{y}$且$x_{3}in S_{y}$,换言之,$S_{y}$必须是$V'$的拓扑序上一个前缀(可以为空)

    由于一个前缀仅通过长度确定,即令$a_{i}=|S_{y}|$(其中$y$为$V_{补}$中拓扑序为$i$的点),合法必要条件为:

    1.$forall 1le i<|V_{补}|,a_{i}le a_{i+1}$,$a_{|V_{补}|}>0$

    2.$forall 1le ile |V_{补}|,|V'|-a_{i}+ile k$

    3.$forall 1le ile |V'|,(i-1+sum [ile a_{j}])le k$

    同时,上述分析已经考虑了所有情况,即这些条件也是充分条件

    首先,每一个点都是相同的,先通过$n-1choose |V'|$、$|V'|!$和$|V_{补}|!$来确定两边的点以及拓扑序(都是DAG),之后即统计合法的$a_{i}$方案数

    对于第3个条件,仅取$i=a_{j}$判定即可,因此等价于$forall 1le ile |V_{补}|,V_{补}-i+a_{i}le k$,即每一个$a_{i}$有一个范围,使其不降的方案数,简单dp再用前缀和维护即可,总复杂度为$o(n^{4})$

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define N 205
     4 int n,k,mod,ans,fac[N],inv[N],l[N],r[N],f[N][N];
     5 int c(int n,int m){
     6     return 1LL*fac[n]*inv[m]%mod*inv[n-m]%mod;
     7 }
     8 int sum(int k,int l,int r){
     9     if (l>r)return 0;
    10     if (!l)return f[k][r];
    11     return (f[k][r]+mod-f[k][l-1])%mod;
    12 }
    13 int calc(int n){
    14     memset(f,0,sizeof(f));
    15     for(int i=l[1];i<=r[1];i++)f[1][i]=i-l[1]+1;
    16     for(int i=2;i<=n;i++)
    17         for(int j=l[i];j<=r[i];j++){
    18             f[i][j]=sum(i-1,l[i-1],min(j,r[i-1]));
    19             if (j>l[i])f[i][j]=(f[i][j]+f[i][j-1])%mod;
    20         }
    21     return sum(n,l[n],r[n]);
    22 }
    23 int main(){
    24     scanf("%d%d%d",&n,&k,&mod);
    25     fac[0]=inv[0]=inv[1]=1;
    26     for(int i=1;i<N-4;i++)fac[i]=1LL*fac[i-1]*i%mod;
    27     for(int i=2;i<N-4;i++)inv[i]=1LL*(mod-mod/i)*inv[mod%i]%mod;
    28     for(int i=2;i<N-4;i++)inv[i]=1LL*inv[i-1]*inv[i]%mod;
    29     for(int i=0;i<=k;i++){
    30         int nn=n-i,kk=k-i;
    31         if (nn==1){
    32             ans=(ans+fac[n])%mod;
    33             continue;
    34         }
    35         for(int j=1;j<=kk;j++){
    36             int jj=nn-1-j;
    37             for(int t=1;t<=jj;t++){
    38                 l[t]=max(j+t-kk,0);
    39                 r[t]=min(kk+t-jj,j);
    40             }
    41             l[jj]=max(l[jj],1);
    42             int s=1LL*c(n,i)*fac[i]%mod*fac[nn-1]%mod;
    43             ans=(ans+1LL*s*calc(jj))%mod;
    44         }
    45     }
    46     printf("%d",ans);
    47 } 
    View Code
  • 相关阅读:
    深度学习在graph上的使用
    简单区分单射、满射与双射
    CSS自定义属性expression_r
    在linux命令下访问url
    Linux添加/删除用户和用户组
    mysql命令
    LAMP 版本查看
    php 下载文件
    linux 自动备份数据库
    linux下添加定时任务
  • 原文地址:https://www.cnblogs.com/PYWBKTDA/p/14163165.html
Copyright © 2020-2023  润新知