码迷,mamicode.com
首页 > 其他好文 > 详细

hdu 5177 (1e18范围的卡特兰数)

时间:2015-02-22 23:08:39      阅读:736      评论:0      收藏:0      [点我收藏+]

标签:algorithm   组合数学   卡特兰数   

hdu 5177 (1e18范围的卡特兰数)

题意:
求第n个卡特兰数,模3814697265625 (5^18)

限制:
有20组数据,1 <= n <= 1e18

思路:
1. 卡特兰数的表达式:
ans = 1/(n+1) * C(2*n,n)
-> ans = 1/(n+1) * (2n)! / n! / n!    ---1式

2. 因为要模5^18,求逆元要求互质,所以先把"1式"中的因子5全部去掉

3. 然后看不含因子5的阶乘,f(n!)

4. 设g(x,n)=(x+1)(x+2)(x+3)(x+4)(x+6)..(x+n)%M,x+d里面的d不是5的倍数

5. 则有f(n!)=g(0,n)*g(0,n/5)*g(0,n/25)*…*g(0,0)%M    ---这里需要log(n)的复杂度

6. 对于每个g(x,n)我们可以把g(x,n)分成尽量均匀的两段来计算
part1=(x+1)(x+2)(x+3)(x+4)(x+6)*…*(x+5*k-1)
part2=(x+5*k+1)(x+5*k +2)(x+5*k +3)(x+5*k +4)(x+5*k +6)*…*(x+5*k +5*k-1)
剩余的项直接暴力乘上来就可以了
然后不断地递归下去    ---这里需要log(n)的复杂度

每次计算出part1,通过代入,可以O(1)计算出part2

这里关键的一点是对于每一个多项式,都可以把它化成这样的形式:
a1*x^0 + a2*x^1 + ... + an*x^n    ---2式
可以看到,对于g(x,n),x总是5的倍数,所以对于每一个part,它所生成的"2式"都不会超过18项。    ---这里需要18的复杂度

这道题的复杂度为log(2n)*log(2n)*18+log(n)*log(n)*18。


代码太挫,跑了7300+ms,压线过的,希望有更好写法的大牛们私信我。



hdu 5177 (1e18范围的卡特兰数)

标签:algorithm   组合数学   卡特兰数   

原文地址:http://blog.csdn.net/whai362/article/details/43909629

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!