POJ2084 Game of Connections(catalan数)

博客探讨了如何解决POJ2084题目,即2n个数字在圆周上连线的问题,保证线段不相交。通过分析得出问题与Catalan数相关,并介绍了Catalan数的通项公式。博主提供了Java代码实现,计算大数情况下的Catalan数,并提到可以基于前几项推断其为Catalan数序列。
摘要由CSDN通过智能技术生成
大意:有2n个数字形成一个圆形,直线段连接一对数字,每一个数字必须连接到另一个数字上。(没有相交的线段)
分析:

现在假设1是要连接的点,它和4相连,为了不破坏规矩——“ 没有相交的线段",2,3只能在右边的圆形区域进行匹配,4——8也不能越过红线,在三角形中进行连线匹配。设n个点的匹配方案数是h(n),那么中的结果就该是h(2)h(5)。极限情况:1和2连接,答案就该是h(0)h(n-1); 1和8连接,答案是h(n-2)h(1)。没错,真相只有一个!这是catalan数。注意:这里的n不是2n,因为1,4相连和4,1相连是一回事。
由通项公式得到:h(n)=C(2n,n)/(n+1)=(2n)!/[n!(n+1)!]
n达到了100,涉及到 大数。。

import java.math.BigInteger;
import java.util.*;
public class Main {
    public static BigInteger []fac=new BigInteger[405];
    public static void get(){
        fac[1]=BigInteger.ONE;
        for(int i=2;i<=400;i++){
            fac[i]=fac[i-1].multiply(BigInteger.valueOf(i));
        }
    }
    public static void main(String[] args) {
        Scanner cin=new Scanner(System.in);
        int n;
        get();
        while(cin.hasNext()){
            n=cin.nextInt();
            if(n==-1) break;
            System.out.println(fac[2*n].divide(fac[n]).divide(fac[n+1]));
        }
    }
}

做题时,如果不能严格证明它是catalan,也可以从前几项猜想可能性。catalan的前几项:
1
2
5
14
42
132
429
1430
4862
16796
58786
208012

爆炸型增长,哈哈哈。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值