T3建造游乐园
这题的关键是推式子
i个点中,有g[i]个方案是度为偶数
但不一定连通
那么就要减去不合法的
设已有j个合法,其个数为f[j],剩下i-j个的方案数是g[i-j]
选出来一个固定的点在合法的j个之中
对于 与这个点连接的j-1的点的选择方案数为C(i-1,j-1)
1 #include<iostream> 2 #include<cmath> 3 #include<cstdio> 4 #define ll long long 5 using namespace std; 6 const int mod=1000000007; 7 8 ll g[2005],f[2005]; 9 ll c[2005][2005],poww[2000000]; 10 11 int main() 12 { 13 //freopen("data","r",stdin); 14 int n; 15 scanf("%d",&n); 16 for(int i=0;i<=n;i++) 17 { 18 c[i][0]=1; 19 for(int j=1;j<=i;j++) 20 c[i][j]=(c[i-1][j]+c[i-1][j-1])%mod; 21 } 22 poww[0]=1; 23 for(int i=1;i<=c[n-1][2];i++) 24 poww[i]=poww[i-1]*2%mod; 25 for(int i=1;i<=n;i++) 26 g[i]=poww[c[i-1][2]]; 27 for(int i=1;i<=n;i++) 28 { 29 ll jl=0; 30 for(int j=1;j<i;j++) 31 jl=(jl+f[j]*g[i-j]%mod*c[i-1][j-1]%mod)%mod; 32 f[i]=(g[i]-jl+mod)%mod; 33 } 34 ll ans=f[n]%mod*c[n][2]%mod; 35 printf("%lld",ans); 36 }
(填个坑)