HDU5015 233 Matrix (2014 ACM/ICPC Asia Regional Xi'an Online)

题意:给定一个矩阵的第一行第一列 求 Anm

状态转移矩阵如下:



代码如下:

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;

const int N = 12;

const int M = 10000007;

int n,m;

struct matrix
{
    long long m[N][N];
};

matrix I,A;

matrix multi(matrix a,matrix b)
{
    matrix c;
    for(int i=0;i<n+2;i++)
        for(int j=0;j<n+2;j++){
                c.m[i][j]=0;
            for(int k=0;k<n+2;k++)
                c.m[i][j]+=(a.m[i][k]   %M*b.m[k][j]%M)%M;
            c.m[i][j]%=M;
        }
    return c;
}

matrix pow(matrix A,int  k)
{
    matrix ans=I,p=A;
    while(k){
        if(k&1){
            ans=multi(ans,p);
            k--;
        }
        k>>=1;
        p=multi(p,p);
    }
    return ans;
}

void init()
{
    for(int i=0;i<n+2;i++){
        for(int j=0;j<n+2;j++)
            I.m[i][j]=(i==j);
    }
    for(int i=0;i<N;i++){
        for(int j=0;j<N;j++){
            if(j<=i)
                A.m[i][j]=1;
            else
                A.m[i][j]=0;
            if(j==1&&i)
                A.m[i][j]=10;
        }
    }
}

int a[12];

int main()
{
    while(~scanf("%d%d",&n,&m)){
        a[0]=3;a[1]=23;
        init();
        for(int i=0;i<n;i++)
            scanf("%d",&a[i+2]);
        matrix ans=pow(A,m);
        long long cnt=0;
        for(int i=0;i<n+2;i++)
            cnt=(cnt+ans.m[n+1][i]*a[i]%M)%M;
        printf("%I64d\n",cnt);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值