233 Matrix HDU - 5015(矩阵递推+思维)

题目链接

题意:第一行矩阵为23,233,2333...给出第一列的矩阵值,求an,m。

思路:很容易想到矩阵求解

 

 

大概就是这样中间一堆都是1.

#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=20;
const int mod=1e7+7;
struct Marix{//矩阵
    int mo[maxn][maxn],n;
    Marix(){}
    Marix(int _n){
        n=_n;
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++) mo[i][j]=0;
        }
    }
};
Marix mul(Marix a,Marix b){//矩阵乘法
    Marix res=Marix(a.n);
    for(int i=0;i<a.n;i++){
        for(int j=0;j<a.n;j++){
            for(int k=0;k<a.n;k++){
                int tmp=(long long )a.mo[i][k]*b.mo[k][j]%mod;
                res.mo[i][j]=(res.mo[i][j]+tmp)%mod;
            }
        }
    }
    return res;
}
Marix powMod(Marix a,int n){//矩阵快速幂
    Marix nul;
    nul=Marix(a.n);
    for(int i=0;i<nul.n;i++){
        nul.mo[i][i]=1;
    }
    while(n){
        if(n&1) nul=mul(nul,a);
        a=mul(a,a);
        n>>=1;
    }
    return nul;
}
int main()
{
    int n,m;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        Marix t1=Marix(n+2);
        t1.mo[0][0]=23;
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&(t1.mo[0][i]));
        }
        t1.mo[0][n+1]=1;
        Marix t=Marix(n+2);
        for(int i=0;i<n+2;i++)
        {
            t.mo[i][i]=1;
            t.mo[n+1][i]=3;
            t.mo[0][i]=10;
        }
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=i;j++)
            {
                t.mo[j][i]=1;
            }
        }
        for(int i=0;i<n+2;i++)
        {
            t.mo[i][n+1]=0;
        }
        t.mo[n+1][n+1]=1;
        
        Marix ans1=powMod(t,m);
        Marix ans=mul(t1,ans1);
        printf("%d\n",ans.mo[0][n]);
    }
 } 

 

posted @ 2020-09-28 19:33  Ldler  Views(113)  Comments(0Edit  收藏  举报