zoukankan      html  css  js  c++  java
  • 矩阵快速幂——将运算推广到矩阵上HDU 1575

    /*

    本题的思路比较简单,就是将递推公式写出来,然后表达成为一个矩阵的形式

    最后通过计算就可以得到一个符合题目要求的矩阵,

    然后就是将矩阵上面所有的对角线元素相加

    得到的结果即为所求的目标

    */

    #include<cstdio> 
    #include<cstring> 
    using namespace std; 
    const int maxn = 15; 
    #define mod 9973 
    int res[maxn][maxn]; 
    int n; 
    void mul(int a[][15],int b[][15],int c[][15]){ 
        int temp[15][15];  memset(temp,0,sizeof(temp)); 
        for(int i=0;i<n;i++) 
          for(int j=0;j<n;j++) 
            for(int k=0;k<n;k++){
               temp[i][j]=(temp[i][j]+ a[i][k]*b[k][j] )%mod; 
            } 
        memcpy(c,temp,sizeof(temp)); 
    }
    void pow(int a[][15],int k){ 
         while(k){ 
             if(k&1){ 
                 mul(res,a,res); 
             } 
             mul(a,a,a); 
             k>>=1; 
         //    printf("%d ",k); 
         } 

    int main(){ 
        int T,k; 
        int a[maxn][maxn]; 
        scanf("%d",&T); 
        while(T--){ 
            scanf("%d%d",&n,&k); 
            for(int i=0;i<n;i++)  for(int j=0;j<n;j++)  res[i][j]=(i==j); 
            //这个做法主要是将对角线标记出来,然后就可以与矩阵a相乘,最后得到的a矩阵就是一个对角矩阵
            for(int i=0;i<n;i++)  for(int j=0;j<n;j++)  scanf("%d",&a[i][j]); 
            pow(a,k); 
            int ans=0; 
            for(int i=0;i<n;i++) ans+=res[i][i]; 
            printf("%d ",ans%mod); 
        } 
        return 0; 

    //自己现在最大的问题就是知道矩阵相乘的方法,但是将一个数组的问题处理好就没办法了……

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////

    矩阵方面的问题处理参考方式

    矩阵乘法
    struct Matrix{
        long long mat[N][N];
        Matrix operator*(const Matrix m)const{
            Matrix tmp;
            for(int i = 0;i < n;i++){
                for(int j = 0;j < n;j++){
                    tmp.mat[i][j] = 0;//完成初始化
                    for(int k = 0;k < n;k++){
                        tmp.mat[i][j] += mat[i][k]*m.mat[k][j]%MOD;
                        tmp.mat[i][j] %= MOD;
                    }}}
            return tmp;
    //这个是通过new一个空间后达到目的的,所以后面会有空间的保留,可以通过这种方式将数组传递下来
        }
    };

    我要坚持一年,一年后的成功才是我想要的。
  • 相关阅读:
    Windows安装Linux虚拟机(CentOS7)
    模拟随机双色球
    git忽略文件夹提交以及gitignore修改后不生效的解决办法
    PHP随手记2--获取随机n位不重复字符
    PHP随手记1--内置函数date
    cocos2d-x源码分析-----触摸事件的实现
    cocos2d-x源码分析-----主循环(android)
    2014年的计划
    cocos2d-x源码分析-----入口分析(android)
    C++中二进制数据强制转换问题
  • 原文地址:https://www.cnblogs.com/tianxia2s/p/3853444.html
Copyright © 2011-2022 走看看