九度oj1443 Tr(A^k)

题目:http://ac.jobdu.com/problem.php?pid=1443
知识:二维数组开辟空间(虽然本例子的代码没有使用,但是我觉得可把结构体换成一个类来写,这样就可以用到这个知识啦)

int row, col;
int **element = NULL;
    //动态开辟数组
    element = new int *[row];//先开辟一个一维的
    //在一维的基础上,为每一个元素开辟一个一维数组
    for (int i = 0; i < row; i++)
    {
        element[i] = new int[col];
    }

二维数组销毁new出来的空间

for (i = 0; i < row; i++)
    {
        delete []element[i];
        element[i] = NULL;
    }
    delete []element;
    element = NULL;

memset百度百科
大致的理解这个是干嘛的,文章的最后写可以用这个来清空一个结构体或者数组这点需要再理解一下。

实现代码:

#include<iostream>
#include<cstring>//memset中要用到的头文件
using namespace std;
#define MOD 9973

int n;//把这个定义为全局的就很方便的可以在每一个函数中使用而且不用传参数,但是全局变量也因为大家都能用所以不安全,尽量少使用比较好
struct  Matrix{
    int mat[11][11];
};
//重载矩阵的乘法
Matrix operator *(Matrix a,Matrix b)
{

    Matrix c;
    memset(c.mat, 0, sizeof(c.mat));//必须要有这一句做一个清零的操作!其实我自己还是没有弄明白,有理解的麻烦留言!
    int i,j,k;
    for(i=0;i<n;i++)
    {
        for(j=0;j<n;j++)
        {
            for(k=0;k<n;k++)
            {
                c.mat[i][j]+=a.mat[i][k]*b.mat[k][j];//矩阵乘法运算法则,线性代数的理论知识化为代码实现
            }
            c.mat[i][j]%=MOD;//防止过大,做mod运算
        }
    }
    return c;
}
//实现矩阵幂
Matrix operator ^(Matrix a,int b)
{
    Matrix c;
    int i,j;
    for(i=0;i<n;i++)
    {
        for(j=0;j<n;j++)
        {
            c.mat[i][j]=(i==j);//将此矩阵初始化为单位矩阵,这样就方便用来求快速幂,相当于一般方法中的res初始化
        }
    }
    //将方阵看作一个普通的数据结构进行快速幂求解
        while(b!=0)//==b&1
    {
        if(b&1)
            c=c*a;//单位矩阵和其他矩阵相乘仍然是其他矩阵
        b=b>>1;//==b/=2
        a=a*a;
    }
    return c;
}
//求矩阵的迹
int trA(Matrix a)
{
    int res=0,i;
    for(i=0;i<n;i++)
    {
        res+=a.mat[i][i];//求对角线之和
        res%=MOD;
    }
    return res;
}

int main()
{
    int T;//t组数据

    cin>>T;
    int k;//n:矩阵的行列,k幂数
    Matrix m;
    while(T--)
    {
        cin>>n>>k;
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<n;j++)
                cin>>m.mat[i][j];
        }
       m= m^k;//矩阵幂的应用
        cout<<trA(m)<<endl;
    }
return 0;
}

如果你觉得我的代码以及注释你还是可以读懂的话就给个小赞吧~有问题可以提出来咱们一起交流进步!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值