tkdsheep-solution-0017

从 Trac 迁移的文章

这是从旧校内 Wiki 迁移的文章,可能存在一些样式问题,您可以向 memset0 反馈。

原文章内容如下:

n个点构成的环上,每个点有两种属性(分别用整数P和Q来表示),P和Q的范围会很大,并且要保证相邻两个点至少有一个属性值是一样的,现在给定其中8个点的属性值,要求剩下的点有多少种方案

这题n、P、Q的范围都很大,很容易就可以猜到是求递推关系然后用矩阵乘法

因为这是一个环,所以随便哪个点作为起点都是一样的,为了方便,这里就选x坐标最小的点作为起点,然后我们就要去找递推关系,起点当然只有1种方案,然后我们来看下面这个例子

1...2......3..4...

1表示给定属性的第一个点,2表示给定属性的第2个点(都是按X坐标拍过序的)
'.'表示其余的未给定的点

由于题目要求相邻两个点至少要有一种属性相同,那么假设第2个点的两个属性值分别是A,B,从第1个给定点转移到第2个给定点的过程中,每个中间点的属性值只有4种情况:[xy,xB,Ay,AB]

这里x表示第一个属性不为A的任意值,y表示第二个属性不为B的任意值

所以可以根据点1和点2的具体属性值来确立初始矩阵,比如点1的属性值为(3,7),点2的属性值为(3,8),那么它们只有属性1相同(即Ay=1),则初始矩阵为[0,0,1,0],其它3种情况类似

这样就确定了初始矩阵T=[xy,xB,Ay,AB]的值

然后每次怎么转移?

这个最好自己推一下,不难的,这里我直接贴出来吧,转移矩阵D是

[p+q-3, 1 , 1 ,0,

q-1  ,p-1, 0 ,1,

p-1  , 0 ,q-1,1,

0   ,p-1,q-1,1],


为什么?随便举个例子吧,比如p+q-3是怎么来的,它表示上一个点的属性是xy的情况下,下一个点的属性还是xy有多少种方案,那么根据容斥,当然就是(p-1)+(q-1)-1

所以每次乘一下这个矩阵D,就能转移一个点,点1到点2的距离是3个点,所以要乘3次,每次都乘D,用快速求幂就OK

注意每转移完一段,都要重置初始矩阵T,重置方法跟前面类似,也是根据两个相邻给定点的属性关系来确定的

最后乘回到起点,矩阵中代表AB的元素就是答案



bonus:这道题也是一个类似的分段矩阵乘法,有兴趣可以看看
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3538

n个点构成的环上,每个点有两种属性(分别用整数P和Q来表示),P和Q的范围会很大,并且要保证相邻两个点至少有一个属性值是一样的,现在给定其中8个点的属性值,要求剩下的点有多少种方案

这题n、P、Q的范围都很大,很容易就可以猜到是求递推关系然后用矩阵乘法

因为这是一个环,所以随便哪个点作为起点都是一样的,为了方便,这里就选x坐标最小的点作为起点,然后我们就要去找递推关系,起点当然只有1种方案,然后我们来看下面这个例子

1...2......3..4...

1表示给定属性的第一个点,2表示给定属性的第2个点(都是按X坐标拍过序的)

'.'表示其余的未给定的点

由于题目要求相邻两个点至少要有一种属性相同,那么假设第2个点的两个属性值分别是A,B,从第1个给定点转移到第2个给定点的过程中,每个中间点的属性值只有4种情况:[xy,xB,Ay,AB]

这里x表示第一个属性不为A的任意值,y表示第二个属性不为B的任意值

所以可以根据点1和点2的具体属性值来确立初始矩阵,比如点1的属性值为(3,7),点2的属性值为(3,8),那么它们只有属性1相同(即Ay=1),则初始矩阵为[0,0,1,0],其它3种情况类似

这样就确定了初始矩阵T=[xy,xB,Ay,AB]的值

然后每次怎么转移?

这个最好自己推一下,不难的,这里我直接贴出来吧,转移矩阵D是

[p+q-3, 1 , 1 ,0,

q-1 ,p-1, 0 ,1,

p-1 , 0 ,q-1,1,

0 ,p-1,q-1,1],

为什么?随便举个例子吧,比如p+q-3是怎么来的,它表示上一个点的属性是xy的情况下,下一个点的属性还是xy有多少种方案,那么根据容斥,当然就是(p-1)+(q-1)-1

所以每次乘一下这个矩阵D,就能转移一个点,点1到点2的距离是3个点,所以要乘3次,每次都乘D,用快速求幂就OK

注意每转移完一段,都要重置初始矩阵T,重置方法跟前面类似,也是根据两个相邻给定点的属性关系来确定的

最后乘回到起点,矩阵中代表AB的元素就是答案

bonus:这道题也是一个类似的分段矩阵乘法,有兴趣可以看看

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3538