【卡特兰数】【高精】WZK打雪仗(war)

【题目背景】
一中操场的格局,同别处不大一样…其实也差不多。
又到冬天了,WZK组织了好多人去打雪仗。WZK一帮共2N人挖了一个以(0,0)为圆心的圆,所有人都在圆周上作战(不在圆的内部)。
但是毕竟WZK要调兵遣将了,而且同学们孤军奋战很无聊,所以其中的N个人每个人会前往另一个人那里结伴作战,在途中同学们只会走两点所连的直线。但是同学们是很小心的,所以一旦发现地面上有一条脚印横在眼前的时候,为了防止滑倒,同学们就不会通过,他们认为这会有危险。但是如果有人没有被访问到而且没有去访问别人的话就会因为无聊而放弃作战。你,帮助WZK,计算一下到底有多少种方案,使得在这帮人认为安全的情况下,所有的人都能去持续作战。
【问题描述】
给出N,请你求出方案总数。

Input

一行一个整数N。

Output

一行一个整数,为方案总数。
无解输出“No Solution”,注意大小写及之间的一个空格,不包括引号。
​ 因为方案数可能很大,所以你懂的…

Sample Input
5
Sample Output
42

不太想优化。。。
卡特兰数:
C[0]=1;
C[1]=1;
C[n]=C[0] * C[n-1]+C[1] * C[n-2]+…C[n-1]*C[0].

#include<cstdio>
#include<cstring>
using namespace std;
int n,f[101][501],c[501];
void C(int aa,int bb){   //高精乘
	memset(c,0,sizeof(c));
	for(int i=1;i<100;++i)
	  for(int j=1;j+i-1<=100;++j)
	    c[i+j-1]+=f[aa][i]*f[bb][j];
	for(int i=1;i<=100;++i){
		c[i+1]+=c[i]/10;
		c[i]%=10;
	}
}
void add(int aa){  //高精加
	for(int i=1;i<=100;++i){
		f[aa][i]+=c[i];
		f[aa][i+1]+=f[aa][i]/10;
		f[aa][i]%=10;
	}
}
int main(){
	freopen("war.in","r",stdin);
	freopen("war.out","w",stdout);
	scanf("%d",&n);
	f[0][1]=1;f[1][1]=1;
	for(int i=1;i<n;++i){
		for(int j=0;j<=i;++j){
			C(j,i-j);
			add(i+1);
		}
	}
	int k=100;
	while(f[n][k]==0) --k;  //输出
	while(k){
		printf("%d",f[n][k]);
		--k;
	}
	fclose(stdin);
	fclose(stdout);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值