NOIP2016年普及组模拟考试(9.3) 3.笨笨连线游戏

32 篇文章 1 订阅
9 篇文章 0 订阅

一、原题

3.笨笨连线游戏(route.cpp

【题目描述】

一天,妈妈在黑板上画了一个大大的圆,然后又在圆弧上标上123...,2N个数。然后让笨笨任意选取一对数(两个不同的数)上连一条直线。然后再任意选取一对数,再边一条直线,但这条直线不能和任何别的直线相交。每个数都要恰好与另一个数连一条直线。

笨笨费了好大的劲才找出一种连线方案。妈妈在旁边问笨笨:给出N,请问不同的连线方案有多少种呢?

笨笨算不出来,只好请教作为大牛的你。

【输入】

多组数据,每组数据的格式为:

1行:1个整数N1<= N <= 150),表示在圆弧上会标记2N个数

当输入的N0时,表示输入结束

【输出】

每组输入对应输出一行,一个整数,表示连线的方案数。由于结果太大,只保留模10007后的余数。

【样例输入】

2 
3 
0 

【样例输出】

2
5


二、分析

这道题要用到递推来做,思路类似“Catalan”,前往百度:Catalan数

  1. n=0时,f0=1
  2. n=1时,f1=1
  3. n=2时,f2=f0*f1+f1*f0=2
  4. n=3时,f3=f1-1*f3-1+f1*f3-2+f2*f3-3);

  5. fn=f0*fn-1+f1*fn-2+...+ fn-1*f0

 第2当n=2时,从1号点出发划一条直线的方案是f1-1*f2-1),从2号点出发划一条直线的方案是f2-1*f2-2),总方案是从1号和2号点出发方案之和。

三、源代码

#include<cstdio>
int f[151],n,j,k,i;
int main()
{
	freopen("route.in","r",stdin);
	freopen("route.out","w",stdout);//文件的读入输出
	f[0]=1;f[1]=1;f[2]=2;
	for(i=3;i<=150;i++)//计算出150以内的所有解
	{
		for(j=0,k=i-1;j<i;j++,k--)
			f[i]+=f[j]*f[k]%10007;
		f[i]=f[i]%10007;
	}
	while(scanf("%d",&n)==1)//输入n
	{
		if(n==0)//如果n是0,结束程序
			return 0;
		printf("%d\n",f[n]);//如果不是,输出结果
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值