题目描述
整个世界都在散发着恋爱的恶臭,只有spring依旧保持着单身贵族的清香。
spring单身久了,煮饺子看见两个黏在一起的都要强行分开,所以在看到凸n边形的时候,总是习惯性的拆分成n-2个小三角形,毕竟第三者插足是spring最喜闻乐见的,那么给出一个凸n边形,有多少种方法能够将凸n边形分解成n-2个小三角形。
输入
输入一个正整数n,表示有个凸n变形 2<n<30
输出
输出有多少种方法能够将凸n边形分解成n-2个小三角形。
样例输入
3 5
样例输出
1 5
就是卡特兰数列C(2n-4,n-2)/n-1
对于C(2n-4,n-2)化简后发现符合C(2n,n)
计算C(2n,n)即可
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <map>
#include <vector>
using namespace std;
unsigned long long C2nn(int n) {
vector<unsigned long long>Catalan(n + 1, 0);
Catalan[0] = 1;
for (int i = 0; i < n; ++i) {
for (int j = 0; j <= i; j++) {
Catalan[i + 1] += Catalan[j] * Catalan[i - j];
}
}
unsigned long long C2nn = Catalan[n] * (n + 1);
return C2nn;
}
int main()
{
int n;
cin>>n;
cout<<C2nn(n-2)/(n-1);
}
卡特兰数
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <map>
#include <vector>
using namespace std;
unsigned long long C2nn(int n) {
vector<unsigned long long>Catalan(n + 1, 0);
Catalan[0] = 1;
for (int i = 0; i < n; ++i) {
for (int j = 0; j <= i; j++) {
Catalan[i + 1] += Catalan[j] * Catalan[i - j];
}
}
unsigned long long C2nn = Catalan[n] * (n + 1);
return C2nn;
}
int main()
{
int n;
cin>>n;
cout<<C2nn(n)/(n+1);
}