杭电1575问题 矩阵相乘问题

今天听了学长讲了一下矩阵相乘     突然感觉自己好像不懂哦    幸亏学长细心教导   呵呵

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;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值