hdu5015-- matrix fast power

Topic links: http://acm.hdu.edu.cn/showproblem.php?pid=5015

Through this sample item can probably it into a door.

Referring know almost link (Fast Power / Matrix Fast Power): https://www.zhihu.com/tardis/sogou/art/42639682

Reference topics blog: https://blog.csdn.net/dragon60066/article/details/60339236

233 Matrix

Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 4735    Accepted Submission(s): 2669


Problem Description
In our daily life we often use 233 to express our feelings. Actually, we may say 2333, 23333, or 233333 ... in the same meaning. And here is the question: Suppose we have a matrix called 233 matrix. In the first line, it would be 233, 2333, 23333... (it means a 0,1 = 233,a 0,2 = 2333,a 0,3 = 23333...) Besides, in 233 matrix, we got a i,j = a i-1,j +a i,j-1( i,j ≠ 0). Now you have known a 1,0,a 2,0,...,a n,0, could you tell me a n,m in the 233 matrix?
 

 

Input
There are multiple test cases. Please process till EOF.

For each case, the first line contains two postive integers n,m(n ≤ 10,m ≤ 10 9). The second line contains n integers, a 1,0,a 2,0,...,a n,0(0 ≤ a i,0 < 2 31).
 

 

Output
For each case, output a n,m mod 10000007.
 

 

Sample Input
1 1 1 2 2 0 0 3 7 23 47 16
 

 

Sample Output
234 2799 72937
Hint
 

 

Source
 

 

Recommend
hujie   |   We have carefully selected several similar problems for you:   6742  6741  6740  6739  6738 
 
Error-prone concept: Matrix Multiplication
1. Left multiplication: Let A m * p matrix, B is p * n matrix, then said m * n matrix C is the matrix product of A and B, referred to as C = AB, A left referred multiplied B.
2. Right multiplication: Let A m * p matrix, B is p * n matrix, then said m * n matrix C is the matrix product of A and B, referred to as C = AB, B times referred to as right A.
3. The matrix vector multiplication have left is the vector, and matrix vector multiply too is the right matrix.
 
ac Code:
#include <the iostream> 
#include < String .h> 
typedef Long  Long LL; 
 the using  namespace STD;
 const  int MOD = + 1E7 . 7 ; 

int n-, m;
 struct Matrix { 
    LL MAT [ 15 ] [ 15 ]; 
    Matrix () 
    { 
        Memset (MAT, 0 , the sizeof (MAT)); 
    } 
}; 

matrix MUL (matrix B, matrix a) // B-multiplying a column matrix a is a * B 
{
     int I, J, K; 
    matrix C; 
    for(I = . 1 ; I <= n-+ 2 ; I ++) // B a few lines 
        for (J = . 1 ; J <= n-+ 2 ; J ++) // A few columns 
            for (K = . 1 ; K <= n-+ 2 ; K ++) // B has several columns / A few lines 
                C.mat [i] [j] = (C.mat [i] [j] + B.mat [i] [k] * A.mat [k ] [J])% MOD;
     return C; 
} 

matrix fastpow (matrix A, int m) // matrix fast power 
{ 
    matrix ANS; 
    for ( int I = . 1 ; I <= n-+ 2 ; I ++) ans.mat [I ] [I] = . 1 ;
    while(m>0)
    {
        if(m&1)ans=mul(ans,A);
        A=mul( A , A );
        m>>=1;
    }
    return ans;
}

int main()
{
    while(cin>>n>>m)
    {
        matrix A,B;
        A.mat[1][1] = 23;
        for(int i=1;i<=n;i++) cin>>A.mat[i+1][1];
        A.mat[n+2][1] = 3;
        for(int i=1;i<=n+1;i++) B.mat[i][1] = 10;
        for(int i=1;i<=n+2;i++) B.mat[i][n+2] = 1;
        for(int i=2;i<n+2;i++)
        {
            for(int j=2;j<=i;j++)
            {
                B.mat[i][j]=1;
            }
        }
        B=fastpow(B,m);
        A=mul(B,A);
        cout<<A.mat[n+1][1]<<endl;
    }
    return 0;
}

 

Guess you like

Origin www.cnblogs.com/Mingusu/p/11907475.html