Train Problem II
- 题目链接
Train Problem II
- 题目大意
问有n个不同的火车进栈,最后出栈的方法总数。
- 题解
经过推导,发现第i个数是C(2n,n)/n+1,就是卡特兰数。我们只要求出前100个卡特兰数就可以了。
- 代码(参考了隔壁大神的代码…)
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int a[105][1005],n;
void solve(int low,int high)
{
int k,t;
for (int i=low;i<=high;i++)
{
int j=1;
for (j=1;j<=a[i-1][0];j++)
{
t=a[i-1][j]*(4*i-2);
a[i][j]=(k+t)%10;
k=(k+t)/10;
}
while (k)
{
a[i][j++]=k%10;
k=k/10;
}
int f=0;
for (;j>=1;j--)
{
t=(a[i][j]+k*10)/(i+1);
k=(a[i][j]+k*10)%(i+1);
if (t && !f)
{
a[i][0]=j;
f=1;
}
a[i][j]=t;
}
}
}
int main()
{
int max1=1;
a[1][1]=1; a[1][0]=1;
while (scanf("%d",&n)!=EOF)
{
if (max1<n)
{
solve(max1+1,n);
max1=n;
}
for (int i=a[n][0];i>=1;i--) printf("%d",a[n][i]);
printf("\n");
}
return 0;
}
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int a[105][1005],n;
void solve(int low,int high)
{
int k,t;
for (int i=low;i<=high;i++)
{
int j=1;
for (j=1;j<=a[i-1][0];j++)
{
t=a[i-1][j]*(4*i-2);
a[i][j]=(k+t)%10;
k=(k+t)/10;
}
while (k)
{
a[i][j++]=k%10;
k=k/10;
}
int f=0;
for (;j>=1;j--)
{
t=(a[i][j]+k*10)/(i+1);
k=(a[i][j]+k*10)%(i+1);
if (t && !f)
{
a[i][0]=j;
f=1;
}
a[i][j]=t;
}
}
}
int main()
{
int max1=1;
a[1][1]=1; a[1][0]=1;
while (scanf("%d",&n)!=EOF)
{
if (max1<n)
{
solve(max1+1,n);
max1=n;
}
for (int i=a[n][0];i>=1;i--) printf("%d",a[n][i]);
printf("\n");
}
return 0;
}