【bzoj_1002】轮状病毒

刚刚看了下Matrix-tree定理

不过好像用Matrix-tree定理的话要高精除高精?囧……

尝试只把ans开高精度,一分都没多得。(不过Python好像可以逆天?)

想写个二分的高精除高精看能不能糊弄过去,但也好难写啊,也想用long double试试看。

正解应该是递推。正在想递推式QAQ

update:好吧把题解补上

这个是开始时的矩阵(根据Matrix-tree定理,删掉了第一行和第一列)

让我们尝试按第一行展开,另h(n)=对角线是3其他2边都是-1的带状n阶矩阵的行列式(注意没有循环,即不能3前面没有-1了就在末尾补上,而应该直接没有,如下图行列式的值为h(8))

则展开以后可以发现,若第一行取3,则对ANS的贡献为3*h(n-1)

若第一行取-1,则应该删掉第一行和第二列。此时因为第二列符号应当取反,所以对答案的贡献为下面矩阵的行列式的值乘以-1,再取反,结果就是下面矩阵行列式的值,如图

此时得到的新矩阵第一行取第一列的-1,得到结果为-h(n-2)

此时得到的新矩阵第一行取第二列的-1,  得到的结果为下面矩阵的行列式

结果好像是-1,因为中间的每一个-1都因为是第二列取反了,只有最后一行第一列的-1没有取反

注意到第一行最后一列有一个-1,再展开,贡献是-1^n(maya题解写到这里不会啦QAQ)

update2:突然又有思路啦

展开的时候按照最后一行展开,如图

按最后一行展开之后得到的结果是-1^(n-1+1)*(-h(n-2))+(-1)^(n-1)

再乘以前面的-1^n得到的结果是-h(n-2)-1

然后可得Ans=3*g(n-1)-2*g(n-2)-2

然后就爽了,易得g(n)=3*g(n-1)-g(n-2)递推算即可

不算高精度复杂度O(n)

posted @ 2015-06-09 14:31  清羽晨风  阅读(305)  评论(0编辑  收藏  举报