HZOI20190714 T3建造游乐场

先放作者的正解:

先说g吧,有i个点的话,在其中i-1个点中有$C_{i-1}^{2}$种边,每个边有选和不选两种情况。如果度不是偶数呢?用剩下那个点给他连上呗。如果剩下那个点度数不是偶数呢?这是不可能的,因为其中i-1个点,每条边会使图的总度数+2,所以图的总度数是偶数,不可能出现奇数个度为奇数的点。既然不知道剩下的点是哪个,为什么不乘n呢?仔细想想,其实所有的情况都已经枚举到了。

#include<iostream>
#include<cstdio>
#define mod 1000000007
#define LL long long
#define int LL
using namespace std;
LL jc[2010];
int n;
int f[2010],g[2010];
LL C[2010][2010];
LL poww(LL a,int b)
{
	LL ans=1;
	while(b)
	{
		if(b&1)ans=(ans*a)%mod;
		a=(a*a)%mod;
		b=b>>1;	
	}
	return ans;
}
signed main()
{
	jc[0]=1;for(int i=1;i<=2010;i++)jc[i]=jc[i-1]*i;
	C[0][0]=1;
	for(int i=1;i<=2010;i++)	
	{
		C[i][0]=1;
		for(int j=1;j<=2010;j++)
			C[i][j]=(C[i-1][j-1]+C[i-1][j])%mod;
	}
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		f[i]=g[i]=poww(2,C[i-1][2]);
		for(int j=1;j<i;j++)
			f[i]=(f[i]-f[j]*g[i-j]%mod*C[i-1][j-1]%mod+mod)%mod;
	}
	printf("%lld
",f[n]*C[n][2]%mod);
	
}
原文地址:https://www.cnblogs.com/Al-Ca/p/11186869.html