UVa1646 Edge Case

题目链接

       Online Judge

题意

        n个结点组成一个圈(n≥3),求匹配(即没有公共点的边集)的个数。例如, n=4时有7个(如下图所示),n=100时有792070839848372253127个。

题解

        最终转化成了斐波那契数列。

        记函数f(n)为所求,可以用n位二进制表示边集的状态,00...0表示空边集(没有边),100...0表示只有1条边。

        考虑首条边在不在集合,只有两种形式:0xx...x、10xx...x0,记第一种形式的数量为a(n),第二种形式的数量为b(n),则 f(n) = a(n) + b(n)。

        考虑第二种形式10xx...x0,总是可以在末尾添加一个1,变成10xx...x01,计数不变,但是位数从n变成了n+1,记为g(n+1) = b(n)。

        同时,第二种形式去掉首位的1和末尾的0,就是0xx...x,变成了第一种形式,但是位数从n变成了n-2,则 b(n) = a(n-2)。

        考虑第一种形式,首条边没用上,所以a(n)完全包含f(n-1),还有010xx...x01的形式没统计到,这正好是g(n-1),因此a(n) = f(n-1) + g(n-1)。

        综上,f(n) = a(n) + b(n)

                         = [f(n-1) + g(n-1)] + a(n-2)

                         = [f(n-1) + b(n-2)] + a(n-2)

                         = f(n-1) + f(n-2)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值