207 条题解
-
0
lk LV 9 @ 19 年前
Catalan 数列
-
-16 年前@
dfs可以过到15,但是n再大一些就会爆时间,建议用递推,当然不愿意思考的懒人就是这样做
程序如下 -
-17 年前@
var
n:longint;
begin
readln(n);
case n of
1:write(1);
2:write(2);
3:write(5);
4:write(14);
5:write(42);
6:write(132);
7:write(429);
8:write(1430);
9:write(4862);
10:write(16796);
11:write(58786);
12:write(208012);
13:write(742900);
14:write(2674440);
15:write(9694845);
16:write(35357670);
17:write(129644790);
18:write(477638700);
19:write(1767263190);
20:write(6564120420);
21:write(24466267020);
22:write(91482563640
23:write(343059613650);
24:write(1289904147324);
25:write(4861946401452);
end;
end. -
-17 年前@
py dafa hao
python
import math
import re
a = int(input())
s = 2
for i in range(a+1,a*2):
s *= i
for i in range(1,a):
s //= i
s //= a+1
print(s)
-
-17 年前@
shit
-
-17 年前@
卡特兰数
#include<iostream>
using namespace std;
const int maxn=20;
long long cat[maxn];
int main(){
int n;
cin>>n;
cat[2]=1;
for(int i=2;i<n+3;++i){
cat[i+1]=(4*i-6)*cat[i]/i;
}
cout<<cat[n+2];
return 0;
} -
-17 年前@
优化卡特兰数:对分子分母分解成以质数为底的幂相乘,指数相减后用快速幂求出答案
-
-18 年前@
一个简单的递归qvq
-
-18 年前@
???楼下在写啥
-
-18 年前@
打表大法好!
```c++
#include<iostream>
using namespace std;int n;
const int table[18]={1,2,5,14,42,132,429,1430,4862,16796,58786,208012,742900,2674440,9694845,35357670,129644790,477638700};int main(){
cin>>n;
cout<<table[n-1];
return 0;
}
``` -
-18 年前@
评测结果
编译成功测试数据 #0: Accepted, time = 0 ms, mem = 536 KiB, score = 10
测试数据 #1: Accepted, time = 0 ms, mem = 540 KiB, score = 10
测试数据 #2: Accepted, time = 0 ms, mem = 536 KiB, score = 10
测试数据 #3: Accepted, time = 0 ms, mem = 540 KiB, score = 10
测试数据 #4: Accepted, time = 0 ms, mem = 540 KiB, score = 10
测试数据 #5: Accepted, time = 0 ms, mem = 540 KiB, score = 10
测试数据 #6: Accepted, time = 0 ms, mem = 540 KiB, score = 10
测试数据 #7: Accepted, time = 0 ms, mem = 540 KiB, score = 10
测试数据 #8: Accepted, time = 0 ms, mem = 536 KiB, score = 10
测试数据 #9: Accepted, time = 0 ms, mem = 540 KiB, score = 10
Accepted, time = 0 ms, mem = 540 KiB, score = 100
代码
#include<cstdio>
#define reg register
int f[21]={0,1};
int s()
{
reg char ch=getchar();
reg int x=ch-'0';
for(;(ch=getchar())>='0'&&ch<='9';)
x=x*10+ch-'0';
return x;
}
int w(reg int r)
{
if(r>9)
w(r/10);
putchar(r%10+'0');
return 1;
}
int main()
{
reg int n=s();
for(reg int i=2;i<=n;i++)
{
f[i]+=2*f[i-1];
for(reg int j=2;j<=i-1;j++)
f[i]+=f[j-1]*f[i-j];
}
w(f[n]);
return !putchar('\n');
}
-
-18 年前@
递归求的卡特兰数。。
var
nn:longint;
function cc(x:longint):int64;
begin
if x=1 then exit(1);
cc:=(cc(x-1)*(4*x-2))div(x+1);
end;
begin
readln(nn);
writeln(cc(nn));
end. -
-18 年前@
pascal 代码
pascal
var
n,i:longint;
a:array[1..15] of longint;
begin
readln(n);
a[1]:=1;
for i:=2 to 15 do
a[i]:=a[i-1]*(4*i-2)div(i+1);
writeln(a[n]);
end.
-
-19 年前@
2333333只是卡特兰数而已
var
f:int64;
n,i:longint;
begin
readln(n);
f:=1;
for i:=2 to n do
f:=f*(4*i-2) div (i+1);
writeln(f);
end. -
-19 年前@
思路:讨论共i个元素时第1个进栈的元素分别可以第1个,第2个......第i个出栈,于是把这i个出栈时分别的方案数相加即可求出总方案数
代码很简洁:
c++
#include <iostream>
using namespace std;
int n,f[20];
int main()
{
cin>>n;
f[1]=1;
for(int i=2;i<=n;i++)
{
f[i]+=2*f[i-1];
for(int j=2;j<=i-1;j++)
f[i]+=f[j-1]*f[i-j];
}
cout<<f[n];
return 0;
}
-
-19 年前@
water problem water problem water problem water problem water problem water problem water problem water problem water problem water problem water problem water problem water problem water problem water problem water problem water problem water problem water problem water problem water problem water problem water problem
var
f:int64;
n,i:longint;
begin
readln(n);
f:=1;
for i:=2 to n do
f:=f*(4*i-2) div (i+1);
writeln(f);
end. -
-19 年前@
#include<cstdio>
using namespace std;int main()
{
int n, a = 1;
scanf("%d", &n);
for(int i=2; i<=n; i++)
a = (4 * i - 2) * a / (i + 1);
printf("%d", a);
return 0;
}
catalan (0,0) -
-110 年前@
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 0ms
├ 测试数据 06:答案正确... 0ms
├ 测试数据 07:答案正确... 0ms
├ 测试数据 08:答案正确... 0ms
├ 测试数据 09:答案正确... 0ms
├ 测试数据 10:答案正确... 0ms -
-110 年前@
program p1122;
var a:array[1..15] of longint;
n:longint;
begin
read(n);
a[15]:=9694845;
a[1]:=1;
a[2]:=2;
a[3]:=5;
a[4]:=14;
a[5]:=42;
a[6]:=132;
a[7]:=429;
a[8]:=1430;
a[9]:=4862;
a[10]:=16796;
a[11]:=58786;
a[12]:=208012;
a[13]:=742900;
a[14]:=2674440;
write(a[n]);
end. -
-111 年前@
Catalan数:
Catalan数前几项为 : 1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440, 9694845, 35357670, 129644790, 477638700, 1767263190, 6564120420, 24466267020, 91482563640, 343059613650, 1289904147324, 4861946401452, ...
没错,正好对应我们的题目,于是果断打出公式
code:
#include<stdio.h>
int main(){
int n,f=1,i;
scanf("%d",&n);
for(i=2;i<=n;i++)
f=f*(4*i-2)/(i+1);
printf("%d\n",f);
return 0;
}