http://162.105.81.212/JudgeOnline/problem?id=3735
这个题也是一个关于矩阵的一个经典的应用。
(转自matrix67)
有n只猫猫排成一排,初始时每只猫猫都没有花生。定义三种操作:给第i只猫猫一颗花生,令第i只猫猫吃掉它所有的花生,交换猫猫i和猫猫j的花生。给出长度不超过k的操作序列,输出循环执行m次操作序列后的结果。数据规模n≤100,k≤100,m≤1 000 000 000。看到这道题我们立马会想到矩阵乘法。如果能为每种操作构造出一个矩阵,m再大二分下来也能承受。我们可以先把序列中的k个操作乘起来,再利用二分自乘m次就可以了。
解题思路:
取向量b表示最后的结果,我这里对于n个数,构造n+1维的向量,目的是有利于后面的‘g’操作
对于每一次的操作用矩阵表示,这里的矩阵a是(n+1,n+1),初始化为一个单位矩阵
‘g’ num 操作,表示使第num个数增加1,使矩阵a的第num行最后一个元素增加1,即a[num][last]+=1
‘e’ num 操作,表示使第num个数变为0,使矩阵a的第num行全部变为0
即for(i=1:i<=last;i++) a[num][i]=0;
‘s’ num1,num2操作,表示使第num1和num2元素交换位置,使矩阵a 的第num1和num2行互换就可以了for(i=1:i<=last;i++) swap(a[num1][i],a[num2][i]);
然后计算a的m次方
最后再与初始化的b向量进行一次乘法,得到的向量的1到last-1即为所要求的结果
下面的代码是把矩阵翻转一下写的:
下面再贴个死活过不了的代码;还一直RE的~~还有超时的:矩阵没有翻转的;