模拟3题解 T3

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 }
View Code

 (填个坑)

猜你喜欢

转载自www.cnblogs.com/casun547/p/11190722.html
T3