您的位置:首页 > 其它

杭电1575问题 矩阵相乘问题

2012-12-19 22:01 302 查看
今天听了学长讲了一下矩阵相乘     突然感觉自己好像不懂哦    幸亏学长细心教导   呵呵

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: