先放作者的正解:
先说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); }