bzoj2863: 愤怒的元首

5 篇文章 0 订阅

题目

Description

求n个点的dag个数。

Solution

f i f_i fi i i i个点的 d a g dag dag个数。
至少有 i i i个入度为 0 0 0的点的方案为: f n − i ( i n ) 2 i ∗ ( n − i ) f_{n−i}(^n_i)2^{i*(n−i)} fni(in)2i(ni)
容斥一下,则: f n = ∑ i = 1 n ( − 1 ) i − 1 f n − i ( i n ) 2 i ∗ ( n − i ) f_n=\sum_{i=1}^{n}(−1)^{i−1}f_{n−i}(^n_i)2^{i*(n−i)} fn=i=1n(1)i1fni(in)2i(ni)

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]);
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值