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; }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。