加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

[bzoj2863] 愤怒的元首

发布时间:2020-12-14 04:29:28 所属栏目:大数据 来源:网络整理
导读:bzoj题目链接(权限题) 前置知识:容斥原理 题解 求 (n) 个点的 (DAG) (有向无环图)的个数。 设 (f(i)) 为 (i) 个点的 (DAG) 的个数。 对于 (n) 个点的 (DAG) 的个数,考虑至少有 (i) 个入度为 (0) 的点的方案为: [ f(n-i) binom{n}{i

bzoj题目链接(权限题)

前置知识:容斥原理

题解

(n)个点的(DAG)(有向无环图)的个数。

(f(i))(i)个点的(DAG)的个数。

对于(n)个点的(DAG)的个数,考虑至少有(i)个入度为(0)的点的方案为:
[ f(n-i) binom{n}{i} 2^{i(n-i)} ]
可以考虑选出了(i)个点,剩下的点和选出的点随便连的方案数。

然后要求的是至少(0)个入度为(0)的点的方案数,由容斥原理可得:
[ f(n)=sum_{i=1}^{n} (-1)^{i-1} f(n-i) binom{n}{i} 2^{i(n-i)} ]

#include<bits/stdc++.h>
using namespace std;
 
#define int long long
 
void read(int &x) {
    x=0;int f=1;char ch=getchar();
    for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-f;
    for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';x*=f;
}
 
void print(int x) {
    if(x<0) x=-x,putchar('-');
    if(!x) return ;print(x/10),putchar(x%10+'0');
}
void write(int x) {if(!x) putchar('0');else print(x);putchar('n');}
 
#define maxn 10050
#define mod 1000000007
 
int qpow(int a,int x) {
    int res=1;
    for(;x;x>>=1,a=a*a%mod) if(x&1) res=res*a%mod;
    return res;
}
 
int f[maxn],fac[maxn],ifac[maxn];
 
signed main() {
    int n;read(n);fac[0]=ifac[0]=1;
    for(int i=1;i<=n;i++) fac[i]=fac[i-1]*i%mod;
    ifac[n]=qpow(fac[n],mod-2);
    for(int i=n-1;i;i--) ifac[i]=ifac[i+1]*(i+1)%mod;
    f[1]=f[0]=1;
    for(int i=2;i<=n;i++) 
        for(int j=1,op=-1;j<=i;j++) op*=-1,f[i]=(f[i]+op*f[i-j]*qpow(2,j*(i-j))%mod*fac[i]%mod*ifac[i-j]%mod*ifac[j]%mod)%mod;
    write((f[n]+mod)%mod);//cerr << (double)clock()/CLOCKS_PER_SEC << endl;
    return 0;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读