这题是比较典型的矩阵乘法的题目。
矩阵乘法的一个用处就是计算常系数线性齐次递推关系,例如菲波衲契数列。
具体请看 http://blog.csdn.net/cclsoft/archive/2010/05/13/5586549.aspx
要注意的地方有如何确定mm矩阵的pow数。还有mm矩阵的初始化。特别是第0行的那些,是代表系数
如F(n) = a*F(n-1)+b*F(n-2)+c*F(n-3)+d*F(n-4)这个数列
初始化一个4*4的mm矩阵
a b c d
1 0 0 0
0 1 0 0
0 0 1 0
那么要pow多少呢,这要看数列是从F(几)开始的,如果是从F(0)开始的,pow后要乘的数列就是f(0) f(1) f(2) f(3),所以就应该pow(k-3)
如果pow后要乘的数列就是 f(1) f(2) f(3) f(4) 就应该pow(k-4),这算一个笨方法。。理解最好。。。
下面就看代码了,只贴出主函数部分。。
int main() { Matrix mm={ {1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, {1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 1, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 1, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 1, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 1, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 1, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 1, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 1, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 1, 0} }; Matrix y; int k, m, i; int sum; while (scanf("%d%d", &k, &m) != EOF) { for (i=0; i < 10; i++) scanf("%d", &mm[0][i]); if (k < 10) { printf("%d/n", k%m); continue; } mod=m; m_pow(mm, k - 9, y); sum=0; for (i=0; i < 10; i++) sum+=y[0][i]*(9 - i); printf("%d/n", sum % m); } return 0; }