fzu 1775 Counting Binary Trees

Posted on 2009-11-24 00:03 王之昊 阅读(576) 评论(2)  编辑 收藏 引用 所属分类: 数学
    感谢AC牛的帮助~~
    这道题是说给你一个n, 求有多少棵不同的二叉树满足其节点数不超过n.(n <= 100,000 ) 结果太大模上 m  (m < 10^9)
    我们已经很熟悉节点数为 n 的不同的二叉树数目是catalan数 Cn. 枚举每个 Ci % m (0 < i <= n)是显然的.
    但是怎么来算Ci % m 呢?
    1   C[i+1] = 2*(2*i+1)/(i+2)*C[i]; 但是m不是素数, 我们怎么处理除法???
    2   单独算 C[i+1]用素因子指数表示的方法(p1^a1 * p2^a2 * ...*pn^an)。可以解决这个问题,但是慢
    于是分成两部分,跟 m 有关的素因子用 2 做, 跟 m 无关的素因子用 1 做,这样就解决了。

Feedback

# re: fzu 1775 Counting Binary Trees   回复  更多评论   

2010-09-05 10:54 by lisongs1
能再讲仔细点吗 该怎么计算 ?是要把C[n]用p1^a1 * p2^a2 * ...*pn^an的方式纪录下来吗?

# re: fzu 1775 Counting Binary Trees   回复  更多评论   

2010-09-10 13:16 by 王之昊
@lisongs1
比如算C(10,3) % 4 等价于 [ (10*9*8) / (3*2*1) ] % 4.
然后又等价于 { [ 2^4 * (5*9*1) ] / [ 2^1 * (3*1*1) ] } % 4,相当于把和4不互素的因子提出来,这种因子是很少的。
然后得到 [ (5*9*1) / (3*1*1) ] % 4 直接用模或者求逆算就可以了

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


posts - 26, comments - 7, trackbacks - 0, articles - 17

Copyright © 王之昊