As we all know the Train Problem I, the boss of the Ignatius Train Station want to know if all the trains come in strict-increasing order, how many orders that all the trains can get out of the railway.
Input
The input contains several test cases. Each test cases consists of a number N(1<=N<=100). The input is terminated by the end of file.
Output
For each test case, you should output how many ways that all the trains can get out of the railway.
Sample Input
1 2 3 10
Sample Output
1 2 5 16796HintThe result will be very large, so you may not process it by 32-bit integers.
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <vector>
#include <cmath>
#include <ctime>
#include <list>
#include <set>
#include <map>
#include <stack>
#include <queue>
using namespace std;
const long long INF=0x7fffffffffffffffll;
int a[105][1000];
void katelan()
{
memset(a,0,sizeof(a));
a[1][1]=1;
a[1][0]=1;
a[2][1]=2;
a[2][0]=1;
int len=1,yu;
for(int i=3;i<=100;i++)
{
yu=0;
for(int j=1;j<=len;j++)
{
int t=a[i-1][j]*(4*i-2)+yu;
a[i][j]=t%10;
yu=t/10;
}
while(yu)
{
a[i][++len]=yu%10;
yu/=10;
}
for(int j=len;j>0;j--)
{
int p=a[i][j]+yu*10;
a[i][j]=p/(i+1);
yu=p%(i+1);
}
while(!a[i][len])
{
len--;
}
a[i][0]=len;
}
}
int main()
{
katelan();
int n;
while(~scanf("%d",&n))
{
for(int i=a[n][0];i>=1;i--)
printf("%d",a[n][i]);
puts("");
}
return 0;
}
本文介绍了一个火车调度问题的解决方案,利用卡特兰数计算所有可能的火车出站顺序数量。通过实现一个高效的算法来处理大规模的数据输入,并提供具体的样例输入输出以验证正确性。
1万+

被折叠的 条评论
为什么被折叠?



