全部博文(330)
分类:
2011-02-07 22:24:03
算法核心:矩阵建模,矩阵的快速幂
大意:已知有n只猫咪,开始时每只猫咪有花生米0颗,先有一组操作:
由下面三个中的k个操作组成:
g i 给i只猫咪一颗花生米
e i 让第i只猫咪吃掉它拥有的所有花生米
s i j 将猫咪i与猫咪j的拥有的花生米交换
现将上述操作做m次后,问每只猫咪有多少颗花生米?
分析:
因m的数据范围较大,用矩阵连乘。
构建矩阵模型,peanut[N] = {0,0,。。。。0,1}:即前n个数为0,最后一个数取1
matrix[N][N],初始化条件下为单位矩阵,。。。
对猫咪进行操作转化为在对矩阵peanut进行操作,一组操作过程转化为矩阵matrix,那么m次操作,即对peanut*(matrix^m)
EXP:
input:
3 1 6
g 1
g 2
g 2
s 1 2
g 3
e 2
初始化下矩阵:peanut
0 0 0 1 即每只猫咪的花生米个数为0
初始化下matrix为单位矩阵
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
经过操作
g 1
给1号1颗花生米,即在第一列的最后一行加1
1 0 0 0
0 1 0 0
0 0 1 0
1 0 0 1
g 2
1 0 0 0
0 1 0 0
0 0 1 0
1 1 0 1
g 2
1 0 0 0
0 1 0 0
0 0 1 0
1 2 0 1
s 1 2
//即交换第1,2列
0 1 0 0
1 0 0 0
0 0 1 0
2 1 0 1
g 3
0 1 0 0
1 0 0 0
0 0 1 0
2 1 1 1
e 2
//将第2列全部置为0
0 0 0 0
1 0 0 0
0 0 1 0
2 0 1 1
最后peanut = peanut*matrix*matrix.....*matrix = peanut*(matrix^m)故可用矩阵快速求幂
peanut的前n个数即为每只猫咪拥有的花生米数