题目大意:求n个点能组成多少种无向连通图
多年的老心病终于干掉了- -
令f[i]表示i个点能组成多少种无向图
首先易知我们能生成2^(i*(i-1)/2)种图 但是一些是不合法的 我们要将不合法的干掉
枚举1号节点与多少个点连通
设1号节点所在联通块大小为j(1<=j<=i-1)
那么与1相连的其它点有C(i-1,j-1)中选法,1号节点所在联通块有f[j]种连法,不与1号节点相连的点有2^((i-j)*(i-j-1)/2)种连法
故得到递推式f[i]=2^(i*(i-1)/2)-Σ[1<=j<=i-1]C(i-1,j-1)*f[j]*2^((i-j)*(i-j-1)/2)
w = open("out.out", "w")
f = [0] * 60
C = [[0] * 60 for i in range(60)]
for i in range(0,51):
C[i][0] = 1
for j in range(1,i+1):
C[i][j] = C[i-1][j] + C[i-1][j-1]
for i in range(1,51):
f[i] = 2**(i*(i-1)//2)
for j in range(1,i):
f[i] -= C[i-1][j-1] * (2**((i-j)*(i-j-1)/2)) * f[j]
w.write("\"%d\",\n" %f[i] )