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一个空间后达到目的的,所以后面会有空间的保留,可以通过这种方式将数组传递下来
        }
    };

    我要坚持一年,一年后的成功才是我想要的。
  • 相关阅读:
    POJ 2756 Autumn is a Genius 大数加减法
    RoboGuice注入框架简单应用
    Android 从相冊获取近期拍摄的多张照片(获取相机拍照所存储的照片)
    不可不知的DIP、IoC、DI以及IoC容器
    Codeforces Round #156 (Div. 2)---A. Greg&#39;s Workout
    zend framework将zip格式的压缩文件导入并解压到指定文件
    TreeSet排序
    Bee Framework_百度百科
    duck
    anglehack参赛总结
  • 原文地址:https://www.cnblogs.com/tianxia2s/p/3853444.html
Copyright © 2011-2022 走看看