【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)