杭电OJ 1131(C++)
程序员文章站
2022-07-13 17:38:00
...
本题和杭电OJ 1030基本相同,在Catalan数的基础上乘以n!,Catalan数的递推公式为 h(n)=h(n-1)*(4*n-2)/(n+1),在每一步多乘以n,变为 h(n)=n*h(n-1)*(4*n-2)/(n+1)即可,需使用大数乘法和大数除法模板。
#include <iostream>
using namespace std;
const int N = 101;
//Catalan数的数组,每一行第一个数S[i][0]是该行Catalan数的位数,
//之后S[i][0]位是第i个Catalan数的倒序
int s[N][3 * N] = { 0 };
int main()
{
s[1][0] = 1; //第一个Catalan数有1位
s[1][1] = 1; //第一个Catalan数为1(倒序)
int i, j;
for (i = 2; i < N; i++)
{
//大数乘法模板
for (j = 1; j <= s[i - 1][0]; j++)
{
//在Catalan数的基础上乘以n(即*i)
s[i][j] += s[i - 1][j] * (4 * i - 2) * i;
s[i][j + 1] += s[i][j] / 10;
s[i][j] %= 10;
}
while (s[i][j])
{
s[i][j + 1] += s[i][j] / 10;
s[i][j] %= 10;
j++;
}
s[i][0] = --j; //该Catalan的位数
//大数除法模板
int res = 0;
for (; j > 0; j--)
{
res = res * 10 + s[i][j];
s[i][j] = res / (i + 1);
res %= (i + 1);
}
while (!s[i][s[i][0]]) //修改该Catalan数的位数
s[i][0]--;
}
int n;
while (cin >> n)
{
if (n == 0)
break;
for (i = s[n][0]; i > 0; i--)
cout << s[n][i];
cout << endl;
}
return 0;
}
继续加油。
上一篇: 杭电OJ 1109(C++)
下一篇: github 创建仓库并上传本地仓库