poj 1737 Connected Graph
1..... f(n)=2^(n*(n-1)/2)-∑i=1,i<nc(n-1,i-1)*f(i)*2^((n-i)*(n-i-1)/2); 反向求结果会超时 哇哇大哭 浪费了一下午时间。
以下是反向求的代码,希望大家看到后能给出一点宝贵的修改意见。
2......正向的公式是f(n)=sum(f(k)*f(n-k)* c(n-2,k-1)*( 2^k-1) | 1<=k<n);反正已经写了一下午反向的程序了,正向的就很简单了。以后再写正向的答案吧。
import java.math.BigInteger;
import java.util.Scanner;
public class Main {
public static BigInteger[]f=new BigInteger[52];
public static BigInteger[][]g=new BigInteger[52][52];
public static BigInteger[][]cn=new BigInteger[52][52];
public static void init() {
for(int i=1;i<=50;++i) {
f[i]=BigInteger.ONE;
for(int j=1;j<=(i*(i-1)/2);++j) {
f[i]=f[i].multiply(BigInteger.valueOf(2));
}
}
for(int i=0;i<=50;++i) {
for(int j=0;j<=50;++j) {
g[i][j]=BigInteger.ONE;
g[i][j].add(g[i][j]);
}
}
for(int i=0;i<=50;++i) {
cn[i][0]=BigInteger.ONE;
cn[i][i]=BigInteger.ONE;
for(int j=0;j<i;++j) {
cn[i][j]=cn[i-1][j].add(cn[i-1][j-1]);
// for(int k=1;k<=((i-j)*(i-j-1)/2);++k) {
// g[i][j]=g[i][j].multiply(BigInteger.valueOf(2));
// }
g[i][j]=g[i][j].pow((i-j)*(i-j-1)/2);
}
}
for(int i=2;i<=50;++i) {
for(int j=1;j<i;++j) {
f[i]=f[i].subtract(cn[i-1][j-1].multiply(f[j]).multiply(g[i][j]));
}
}
}
public static void main(String[] args) {
init();
int n = 0;
Scanner s=new Scanner(System.in);
while(s.hasNext())
{
if(n==0)
break;
System.out.println(f[n]);
}
}
}
今天是runningtime error的一天!哇哇大哭!
我想要变得高一点,最好能伸手给你一片天。