Description
求n个点的dag个数。
Solution
设 fi为 i个点的 dag个数。
至少有 i个入度为 0的点的方案为: fn−i(in)2i∗(n−i)
容斥一下,则: fn=∑i=1n(−1)i−1fn−i(in)2i∗(n−i)
Code
#include<cstdio>
const int N=3002,M=1e9+7;
int n,bin[N*N/4],f[N],c[N][N],i,j;
int main(){
scanf("%d",&n);
for (i=bin[0]=f[0]=1;i<=n*n/4;i++) bin[i]=(bin[i-1]<<1)%M;
for (i=0;i<=n;i++)
for (j=1,c[i][0]=1;j<=i;j++)
f[i]=(f[i]+1ll*(j&1?1:-1)*f[i-j]*(c[i][j]=(c[i-1][j]+c[i-1][j-1])%M)%M*bin[j*(i-j)]+M)%M;
printf("%d",f[n]);
}