【题目背景】
一中操场的格局,同别处不大一样…其实也差不多。
又到冬天了,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);
}