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的一天!哇哇大哭!

posted @ 2019-01-22 17:58  ikefire  阅读(115)  评论(0编辑  收藏  举报