D e s c r i p t i o n Description Description
有
2
n
2n
2n个人在一个圆圈里
(按顺序排)
有n个人要到另外n个人那
问有多少种方法
使他们的路径不会交叉
I n p u t Input Input
一个数,n
O u t p u t Output Output
一个数,方案数、
S a m p l e I n p u t Sample Input SampleInput
5
S a m p l e O u t p u t Sample Output SampleOutput
42
思路
卡特兰数
高精压位
我是用下图的规律(二维)】
F
[
i
]
[
j
]
=
F
[
i
−
1
]
[
j
]
+
F
[
i
]
[
j
−
1
]
F[i][j]=F[i-1][j]+F[i][j-1]
F[i][j]=F[i−1][j]+F[i][j−1]
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#define INF 1000000000
#define ll long long
using namespace std;
int F[125][125][10];
int n;
void Add(int *A,int *X,int *Y)
{
int l=0;
for(int i=1;i<=10;++i)
{
l=X[i]+Y[i]+l;
A[i]=l%INF;
l/=INF;
}
return;
}
void Write(int *A)
{
int l=11;
while(!A[--l] && l>1);
printf("%d",A[l]);
while(--l)
{
if(A[l]<1e8)printf("0");
if(A[l]<1e7)printf("0");
if(A[l]<1e6)printf("0");
if(A[l]<1e5)printf("0");
if(A[l]<1e4)printf("0");
if(A[l]<1e3)printf("0");
if(A[l]<1e2)printf("0");
if(A[l]<1e1)printf("0");
printf("%d",A[l]);
}
return;
}
int main()
{
freopen("war.in","r",stdin);
freopen("war.out","w",stdout);
scanf("%lld",&n);
for(int i=1;i<=n;++i)F[1][i][1]=i;
for(int i=2;i<=n;++i)
for(int j=i;j<=n;++j)
Add(F[i][j],F[i-1][j],F[i][j-1]);
Write(F[n][n]);
fclose(stdin);
fclose(stdout);
return 0;
}