题目背景
这个三角图真好看。。
这个是4阶三角图。。
题目描述
现在我们定义一个三角图是像上面一样的图。。
请求出一个N阶三角图从最上方的顶点走到右下方的点的方案数。
有T组询问。
输入输出格式
输入格式:
第一行一个正整数T
第二行T个正整数Ni。
输出格式:
T行,共T个正整数,表示答案模998244353的结果。
输入输出样例
输入样例#1:
3 1 2 3
输出样例#1:
1 2 6
说明
数据范围10^6
思路:只知道每个点等于上面的+右上的+左边的。只会递推,但会超时,然后去oeis找到了这么个东西——大施罗德数(超级卡特兰数)
施罗德数的前几项为1, 2, 6, 22, 90, 394, 1806, 8558, 41586, 206098,...
oeis到的公式
然后会发现这个的第i项等于卡特兰数第i+1项的2倍(除了第1项)(这就是被称为超级卡特兰数的原因吗?)
代码实现使用快速幂+费小马求逆元实现的
代码如下:(该代码取自网上,个人留作模板使用,来源地址:https://blog.csdn.net/LJD201724114126/article/details/81661838)
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=3e6;
typedef long long LL;
#define mod 998244353
LL num[maxn];
LL inverse(LL x,LL y)///快速幂加费马小定理求逆元
{
LL sum=1;
while(y)
{
if(y&1) sum=sum*x%mod;
y/=2;
x=x*x%mod;
}
return sum%mod;
}
int main()
{
int n,t;
num[1]=num[0]=1;
for(int i=2;i<=maxn;i++)
{
num[i]=((6*i-3)*num[i-1]%mod-(i-2)*num[i-2]%mod+mod)%mod*inverse(i+1,mod-2)%mod;
}
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
if(n==1) {
printf("1\n");continue;
}
printf("%lld\n",num[n-1]*2%mod);
}
return 0;
}