cojs 疯狂的粉刷匠 疯狂的斐波那契 题解报告
疯狂的斐波那契
学习了一些奇怪的东西之后出的题目
最外层要模p是显然的,然而内层并不能模p
那么模什么呢,显然是模斐波那契的循环节
那么我们可以一层层的求出每层的斐波那契循环节
之后在从内向外用矩阵乘法计算即可
至于如何求斐波那契的最小循环节,参见本博客的Fib求循环节那篇文章
当然这个题可以只求循环节,不求最小循环节,这样会好写的多
(然而我不会告诉你这样的话最后会爆掉long long)
疯狂的粉刷匠
我们设树上一共有k个联通点集
包含点i的联通点集有f(i)个
那么答案显然是sigma(f(i)/k)
首先我们考虑如何求k,对于任意一个树上的联通点集
一定有且仅有一个深度最小的点
设g(i)表示i是联通块深度最小的点的方案数
设j为i的孩子,那么g(i)显然为g(j)+1的连乘积
这样k=sigma(g(i))
之后我们考虑f(i),对于任意一个点所在的联通点集
这个点只有两种情况:
1、是深度最小的点
2、不是深度最小的点
如果出现2情况,则其父亲一定在这个联通块内
设i的父亲为j
我们就可以得到f(i)=g(i) + g(i)*( f(j)/(g(i)+1) )
之后统计答案即可