题目链接
题意
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)