【HDU 5015】233 Matrix

【题目链接】

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

【算法】

          矩阵乘法

【代码】

           

#include<bits/stdc++.h>
using namespace std;
const int P = 10000007;

int i,j,n,m,ans;
int a[20],val[20];

struct Matrix
{
        int mat[20][20];
} b;

inline void multipy(Matrix &a,Matrix b)
{
        int i,j,k;    
        Matrix res;
        memset(res.mat,0,sizeof(res.mat));
        for (i = 0; i <= n + 1; i++)
        {
                for (j = 0; j <= n + 1; j++)
                {
                        for (k = 0; k <= n + 1; k++)
                        {
                                res.mat[i][j] = (res.mat[i][j] + 1ll * a.mat[i][k] * b.mat[k][j]) % P;
                        }
                }
        }
        a = res;
}
inline Matrix power(Matrix a,int n)
{
        Matrix res;
        memcpy(res.mat,a.mat,sizeof(a.mat));
        n--;
        while (n > 0)
        {
                if (n & 1) multipy(res,a);
                multipy(a,a);
                n >>= 1;
        }
        return res;
}

int main() 
{
        
        while (scanf("%d%d",&n,&m) != EOF)
        {
                ans = 0;
                a[0] = 0;
                for (i = 1; i <= n; i++) scanf("%d",&a[i]);
                val[0] = 233;
                for (i = 1; i <= n; i++) val[i] = (val[i-1] % P + a[i] % P) % P;
                val[n+1] = 3;
                if (m == 1)
                {
                        printf("%d\n",val[n]);
                        continue;
                }
                memset(b.mat,0,sizeof(b.mat));
                for (i = 0; i <= n; i++)
                {
                        b.mat[i][0] = 10;
                        b.mat[i][n+1] = 1;
                        for (j = 1; j <= n; j++)
                        {
                                b.mat[i][j] = (i >= j);
                        }
                }        
                b.mat[n+1][n+1] = 1;
                b = power(b,m-1);
                for (i = 0; i <= n + 1; i++) ans = (ans + 1ll * b.mat[n][i] * val[i]) % P;
                printf("%d\n",ans);
                
        }
        
        return 0;
    
}

 

posted @ 2018-07-12 16:02  evenbao  阅读(104)  评论(0编辑  收藏  举报