Hdu5015 233 Matrix矩阵

每一列能由前一列推过来,构造一个(n+2)*(n+2)的矩阵B,第k列 就等于  所构造的第一列A*B^(k-1)

比如

233                            10    10    10    0           2333

a1+233            *                1      1      0    =     a1+233+2333

a1+a2+233                                1      0           a1+a2+233+a1+233+2333

3                                1      1     1      1           3

#include <cstdio>
#include <algorithm>
#include <iostream>
#include <string.h>
typedef long long LL;
using namespace std;

const LL mod = 10000007;

LL n;
struct Matrix
{
    LL m[15][15];
};


Matrix Mul(Matrix a, Matrix b)
{
    Matrix ans;
    for (LL i = 0; i < n + 2; i++){
        for (LL j = 0; j < n + 2; j++){
            ans.m[i][j] = 0;
            for (LL k = 0; k < n + 2; k++){
                ans.m[i][j] += a.m[i][k] * b.m[k][j];
                ans.m[i][j] %= mod;
            }
        }
    }
    return ans;
}

Matrix quick(Matrix a, LL b)
{
    Matrix ans;
    for (LL i = 0; i < n + 2; i++)
    for (LL j = 0; j < n + 2; j++)
        ans.m[i][j] = (i == j);
    while (b){
        if (b & 1) ans = Mul(ans, a);
        b >>= 1;
        a = Mul(a, a);
    }
    return ans;
}

Matrix init()
{
    Matrix ans;
    for (LL i = 0; i < n + 2; i++)
    for (LL j = 0; j < n + 2; j++)
        ans.m[i][j] = 0;
    for (LL i = 0; i < n + 1; i++)
        ans.m[0][i] = 10;
    for (LL i = 1; i < n + 1; i++){
        for (LL j = i; j < n + 1; j++)
            ans.m[i][j] = 1;
    }
    for (LL i = 0; i < n + 2; i++)
        ans.m[n + 1][i] = 1;
    return ans;
}


int main()
{
    LL a[1000];
    LL k;
    while (cin >> n >> k){
        for (LL i = 1; i < n + 1; i++)
            cin >> a[i];
        a[0] = 233; a[n + 1] = 3;
        for (LL i = 1; i<n + 1; i++)
            a[i] += a[i - 1];
        Matrix gao = init();
        gao = quick(gao, k - 1);
        LL sum = 0;
        for (LL i = 0; i < n + 2; i++){
            sum += a[i] * gao.m[i][n];
            sum %= mod;
        }
        cout << sum << endl;
    }
    return 0;
}

 

posted on 2014-10-30 21:10  一个西瓜  阅读(220)  评论(0编辑  收藏  举报

导航