以上均为矩阵乘法及快速幂水题,只是有些变化。
poj3233 为前n次矩阵和,有一个定理
Let B= A I 0 I B^(k+1) = A^k I+A+...+A^k 0 II 即单位矩阵,A为所给矩阵,学过线性代数应该能理解。
也有第二种解法,不过我不懂。。。
poj1995 与上面的类似
hdu1575 单纯的矩阵乘法
hdu 1757 一种隐藏的矩阵乘法,代码如下:
#include<cstdio>
int k,m;
struct fun
{
int f[12][12];
};
fun a,b,c;
fun mul(fun x,fun y)
{
int i,j,k;
fun sum;
for(i = 0; i < 10; i++)
for(j = 0; j < 10; j++){
sum.f[i][j] = 0;
for(k = 0; k < 10; k++)
sum.f[i][j] += x.f[i][k]*y.f[k][j]%m;
sum.f[i][j] %= m;
}
return sum;
}
fun quick_mode(int n)
{
fun p = c;
fun q = a;
n -= 9;
while(n)
{
if(n % 2)
p = mul(p,q);
n /= 2;
q = mul(q,q);
}
return p;
}
int main()
{
while(scanf("%d%d",&k,&m) != EOF)
{
int i,j;
for(i = 0 ;i < 10 ;i++)
a.f[i][i+1] = 1;
for(i = 0; i < 10; i++)
scanf("%d",&a.f[i][0]);
for(i = 0; i < 10 ;i++)
b.f[0][i] = 9 - i;
for(i = 0; i < 10; i++)
for(j = 0; j < 10; j++){
if(i == j)
c.f[i][j] = 1;
else c.f[i][j] = 0;
}
fun d = quick_mode(k);
fun t = mul(b,d);
printf("%d\n",t.f[0][0]%m);
}
return 0;
}