摘自:超级卡特兰数(又称大施罗德数)
百度百科: 施罗德数
在组合数学中,施罗德数用来描述从 (0,0) 到 (n,n) 的网格中,只能使用 (1,0)、(0,1)、(1,1) 三种移动方式,始终位于对角线下方且不越过对角线的路径数。
施罗德数的前几项(从第 0 项算起)为 1,2,6,22,90,394,1806,8558,41586,206098……
(OEIS A006318)
下图为 n=1,2,3 时的施罗德路径
施罗德数的递推公式为
Si=Si−1+i−1∑j=0SjSn−j−1
不过 O(n2) 的递推在 1e5级别的数据面前显然是要超时的
有递推式
(i+1)Fi=(6n−3)Fi−1−(i−2)Fi−2
使得 F0=S0,对于任意的 i≥1 都有 2Fi=Si
C++ 代码
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long LL;
const int N = 100010, mod = 1e9 + 7;
int qmi(int a, int k)
{
int res = 1;
while(k)
{
if(k & 1) res = (LL)res * a % mod;
k >>= 1;
a = (LL)a * a % mod;
}
return res;
}
LL f[N], s[N];
void init(int n)
{
f[0] = s[0] = f[1] = 1;
s[1] = 2;
for(int i = 2; i <= n; i ++)
{
f[i] = ((6 * i - 3) * f[i - 1] - (i - 2) * f[i - 2]) % mod * qmi(i + 1, mod - 2) % mod;
s[i] = f[i] * 2 % mod;
}
}
int main()
{
init(N - 1);
for(int i = 0; i < 10; i ++) printf("%d\n", s[i]);
return 0;
}
让我崩溃的施罗德数。。。终于找到题解了,谢谢大佬!
我也就是记个结论qwq
已经很nb了,我学奥数是做这类题直接吐(但是是作业,不得不做,所以后来搜baidu了,但也没结果。。。)
前排%%%%%%%%%%滑稽大佬
qwq抽风大佬饶了我吧orz
(>w<)