• 【题解】有标号的DAG计数1


    [HZOI 2015] 有标号的DAG计数 I

    (f_i)(i)个点时的DAG图,(不必联通)

    考虑如何转移,由于一个DAG必然有至少一个出度为(0)的点,所以我们钦定多少个出度为(0)的点转移。

    考虑如何保证没有环,钦定完出度为(0)的点后,这些点就等着被连接了。还剩下一些点,这些点只要不构成环就好了,就是个子结构,访问以前的DP数组就好了。

    [ {ichoose j}2^{j imes (i-j)}dp_{i-j} ]

    这样转移显然有方案重复的情况,因为如此计数就破坏了钦定,出度为(0)点可能更多!(我们不加限制的枚举(j(i-j))条边是否存在)。

    考虑一种方案出现了多少次,很显然出现的分布是这样的:

    [{i choose 1}+{i choose 2}+{i choose 3}dots ]

    借鉴一下[【题解】HAOI2018]染色(NTT+容斥/二项式反演)(怎么又是你),直接乘上一个((-1)^?)就就容斥掉了,试一试就发现是((-1)^{j+1})

    转移是:

    [dp_i=sum_{j=1}^i {ichoose j}2^{j imes (i-j)}dp_{i-j}(-1)^{j+1} ]

    或者学习神Itst的神仙待定系数法

    设枚举的出度为(0)的点的个数为i时的容斥系数为(f_i),那么一个实际上存在(x)个出度为0的点的DAG的贡献就是(sumlimits_{i=1}^x inom{x}{i} f_i = 1),不难由二项式定理知道(fi=(−1)^{i−1})

    orz orz

    //@winlere
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
     
     
    using namespace std;  typedef long long ll;
    inline int qr(){
          register int ret=0,f=0;
          register char c=getchar();
          while(c<48||c>57)f|=c==45,c=getchar();
          while(c>=48&&c<=57) ret=ret*10+c-48,c=getchar();
          return f?-ret:ret;
    }
     
    const int maxn=5e3+5;
    const int mod=10007;
    int c[maxn][maxn];
    int dp[maxn];
    int bin[maxn*maxn];
     
    int main(){
          freopen("DAG.in","r",stdin);
          freopen("DAG.out","w",stdout);
          int n=qr();
          bin[0]=1;dp[0]=1;
          for(register int t=0;t<=n;++t){
    	    c[t][0]=1;
    	    for(register int i=1;i<=t;++i){
    		  c[t][i]=(c[t-1][i-1]+c[t-1][i])%mod;
    	    }
          }
          for(register int t=1;t<=n*n;++t) bin[t]=(bin[t-1]<<1)%mod;
          
          for(register int t=1;t<=n;++t){
    	    for(register int i=1,d;i<=t;++i){
    		  d=mod-c[t][i]*bin[i*(t-i)]%mod*dp[t-i]%mod;
    		  if(i&1) d=mod-d;
    		  dp[t]=(dp[t]+d)%mod;
    	    }
          }
          printf("%d
    ",dp[n]);
          return 0;
    }
    
  • 相关阅读:
    GOF23设计模式汇总
    获取表单提交MVC错误信息
    Spring.Net
    简单工厂、工厂方法和抽象工厂
    Json和JsonP
    mysql8无法用navicat连接(mysql8加密方式的坑)
    (4.16)mysql备份还原——物理备份之XtraBackup实践
    mysql如何下载历史版本?
    如何测试端口通不通(四种方法)
    linux移动复制删除命令
  • 原文地址:https://www.cnblogs.com/winlere/p/11258184.html
Copyright © 2020-2023  润新知