题目来源:http://acm.pku.edu.cn/JudgeOnline/problem?id=3735
解题思路:
取向量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即为所要求的结果
该题注意的地方:
1:矩阵乘法中做乘法前判断两个乘数是否均为0
2:构造矩阵a的过程,开始我是每进行一次操作就用一次矩阵乘法,导致超时,其实只要每次修改下矩阵就可以了
3:注意最后结果可能超过int的范围,要用__int64
看status里还有几个是0ms过的,不知道他们是用什么方法,还请知道的大牛指教!