zoukankan      html  css  js  c++  java
  • HDU 4965 Fast Matrix Calculation (矩阵快速幂取模----矩阵相乘满足结合律)

    http://acm.hdu.edu.cn/showproblem.php?pid=4965

    利用相乘的可结合性先算B*A,得到6*6的矩阵,利用矩阵快速幂取模即可水过。

     1 #include<iostream>
     2 #include<stdio.h>
     3 #include<iostream>
     4 #include<stdio.h>
     5 #define N 1010
     6 #define M 1010
     7 #define K 6
     8 using namespace std;
     9 struct matrix
    10 {
    11     int m[N][M];
    12     int row,col;
    13 };
    14 matrix A,B,C,ANS;
    15 matrix t;
    16 matrix &matrix_mul(matrix &a,matrix &b,int p)//a,b矩阵相乘每个数模p
    17 {
    18     for(int i=0;i<a.row;i++)
    19             for(int j=0;j<b.col;j++)
    20                 t.m[i][j]=0;
    21     t.row=a.row;
    22     t.col=b.col;
    23     for(int i=0;i<a.row;i++)
    24         for(int k=0;k<a.col;k++)
    25         {
    26             for(int j=0;j<b.col;j++)
    27                 t.m[i][j]=(t.m[i][j]+a.m[i][k]*b.m[k][j])%p;
    28         }
    29     return t;
    30 }
    31 
    32     matrix ans;
    33 matrix &fast_matrixt_mul_mod(matrix &a,int b,int p)//矩阵a的b次方模p
    34 {
    35     for(int i=0;i<N;i++)
    36         for(int j=0;j<M;j++)
    37         if(i==j)ans.m[i][j]=1;
    38         else ans.m[i][j]=0;
    39     ans.row=a.row;
    40     ans.col=a.col;
    41         //cout<<"=="<<endl;
    42     while(b)
    43     {
    44         if(b&1)
    45         {
    46             b--;
    47             ans=matrix_mul(ans,a,p);//ans=ans*a%m;
    48         }
    49         else
    50         {
    51             b/=2;
    52             a=matrix_mul(a,a,p);//a=a*a%m;
    53         }
    54     }
    55     return ans;
    56 }
    57 int main()
    58 {
    59     int n,k;
    60     while(scanf("%d%d",&n,&k),n!=0||k!=0)
    61     {
    62         for(int i=0;i<n;i++)
    63         {
    64             for(int j=0;j<k;j++)
    65                 scanf("%d",&A.m[i][j]);
    66         }
    67         A.row=n;
    68         A.col=k;
    69         for(int i=0;i<k;i++)
    70         {
    71             for(int j=0;j<n;j++)
    72                 scanf("%d",&B.m[i][j]);
    73         }
    74         B.row=k;
    75         B.col=n;
    76         C=matrix_mul(B,A,6);
    77         C=fast_matrixt_mul_mod(C,n*n-1,6);
    78         ANS=matrix_mul(A,C,6);
    79         ANS=matrix_mul(ANS,B,6);
    80         int sum=0;
    81         for(int i=0;i<n;i++)
    82         {
    83             for(int j=0;j<n;j++)
    84             sum+=(ANS.m[i][j]%6);
    85         }
    86         printf("%d
    ",sum);
    87     }
    88     return 0;
    89 }
    View Code
  • 相关阅读:
    接口和实现接口的类
    类的封装
    实验六:类的封装
    实验五:任意输入10个int类型数据,排序输出,再找出素数
    实验四:采用一维数组输出等腰三角形的杨辉三角
    2017-12-31 小组工作记录
    2017-12-30 小组工作记录
    2017-12-29 小组工作记录
    2017-12-24 小组工作记录
    2017-12-21 小组工作记录
  • 原文地址:https://www.cnblogs.com/huzhenbo113/p/3928941.html
Copyright © 2011-2022 走看看