今天听了学长讲了一下矩阵相乘 突然感觉自己好像不懂哦 幸亏学长细心教导 呵呵
http://acm.hdu.edu.cn/showproblem.php?pid=1575
要想学矩阵相乘 首先学一下 3^1024怎么做啊 你可然觉得很简单 但你一定会超时哦 所以要小心
我感觉这个方法特好
int Pow(int a, int k){
int r=1;
while(k){
if(k&1) r= r*a;
a= a*a;
k= k/2; //k>>= 1;
// 每一次k移动一位哦 printf("%d %d %d\n", k, r, a);
}
return r;
}
void work(){
printf("%d\n", Pow(3, 14));
}
我们举一个例子哦 在这里 当k是14时 我们用二进制来表示就是1110 而K&1就是表示判断k是否是一个1还是0 如果k是1的话 r 就相乘起来哦 当如果k是0 的话就不变我这里所说的k 是用二进制表示的 k 的位数 所以这个地方要小心一点 1110=1000+100+10 这里所说的是二进制加法哦 每一次k移动一位哦
这样时间复杂度就减轻了许多哦 以前你要乘以13次才可以 现在你只要乘以4次就ok了 所以说你用这个方法你不用担心超时哦 呵呵
下面我们来讲这个题的重点了 其实如果你听懂上面的 其实下面的你也会哦
struct Matrix{
int a[size][size];
}one;
首先我们用结构体来表示矩阵哦 下面就是重点了 其实道理跟上面一样的
Matrix x;
Matrix mult(Matrix x, Matrix y)
{
Matrix z;
for(int i=0; i<size; ++i)
for(int j=0; j<size; ++j){
z.a[i][j]= 0;
for(int k=0; k<size; ++k){
z.a[i][j] += (x.a[i][k]*y.a[k][j])%mod;
//矩阵相乘应该都知道哦 z.a[i][j] %= mod;
//mod就是题目所说的9973 }
}
return z;
}
Matrix Pow_matrix(Matrix x, int k){
Matrix r= one;
while(k){
if(k&1) r= mult(r, x);
x= mult(x, x);
k>>= 1;
//这个是移动一位哦 呵呵 }
return r;
}