标签:比较 eof 递归 code int 不同的 span 快速 matrix
模板
快速幂模板
1 void solve(matrix t,long long o) 2 { 3 matrix e; 4 5 memset(e.a,0,sizeof(e.a)); 6 7 for (int i = 0;i < d;i++) 8 e.a[i][i] = 1; 9 10 while (o) 11 { 12 if (o & 1) 13 { 14 e = mul(e,t); 15 } 16 17 o >>= 1; 18 19 t = mul(t,t); 20 } 21 22 long long res = 0; 23 24 for (int i = 0;i < d;i++) 25 res = (res + e.a[0][i] * f[d-i-1]) % m; 26 27 printf("%lld\n",res); 28 }
矩阵相乘代码
1 struct matrix 2 { 3 long long a[20][20]; 4 }; 5 6 matrix mul(matrix x,matrix y) 7 { 8 matrix c; 9 10 for (int i = 0;i < d;i++) 11 for (int j = 0;j < d;j++) 12 { 13 c.a[i][j] = 0; 14 15 for (int k = 0;k < d;k++) 16 { 17 c.a[i][j] = (c.a[i][j] + x.a[i][k] * y.a[k][j] % m) % m; 18 } 19 } 20 21 return c; 22 }
简单讲解:
矩阵快速幂,就只是把快速幂中的数改成了矩阵,兰儿其实还是有不同的地方,因为快速幂一般用的是递归实现,但是lrj大大说矩阵快速幂还是用迭代实现比较好。
举一个例子,A^15,可以写成(A^8) * (A^4) * (A^2) * (A^1) 的形式,可以看到8,4,2,1都是2的次幂,所以我们就可以方便的运用位运算。
15:1111,那么每次这个数字右移一位,那么矩阵就平方一次,然后遇到当前的最后一位111k,k & 1 == 1,这个时候结果矩阵就要乘以当前的用于运算的矩阵。
矩阵预算也是挺好理解的,用手算模拟一下就可以了。
标签:比较 eof 递归 code int 不同的 span 快速 matrix
原文地址:http://www.cnblogs.com/kickit/p/7287118.html