题解 | #あなたの蛙が帰っています#

あなたの蛙が帰っています

https://www.nowcoder.com/practice/44a2fc12a92a4eccb13a78eabfb67063

注意到,题目所求的答案,即为卡特兰数相邻两项的差。
这里给出卡特兰数的前 项(下标从0开始)。

1, 1, 2, 5, 14, 
42, 132, 429, 1430, 4862, 
16796, 58786, 208012, 742900, 2674440, 
9694845, 35357670, 129644790, 477638700, 769018837, 
574654302, 508402548, 642327517, 661800571, 172443248, 
496402342, 655221305, 840507789, 812999877, 893261956

卡特兰数可以用递推式求出:

因为数据增长很快,题目要求你进行取模。
此时除法需要转换为对应的逆元
考虑到 998244353 是一个大素数,和小于它的任何正整数都互质。
所以可以使用费马小定理
这里的 pow 需要使用快速幂求解,朴素乘法会超时,浮点函数会爆精度。

最后作差的时候,需要注意规约到 [0,mod) 的范围内,因为有可能出现
只需加一点修饰

python 参考代码:

mod=998244353
N=100100
k=[0]*N
k[0]=k[1]=1
for i in range(2,N):
    k[i]=k[i-1]*(4*i-2)%mod*pow(i+1,mod-2,mod)%mod
t=int(input())
for i in range(1,t+1):
    n=int(input())
    print('Case #%d: %d'%(i,(k[n]-k[n-1]+mod)%mod))
全部评论

相关推荐

10-22 19:44
门头沟学院 Java
面了100年面试不知...:那我得去剪个头
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务