hdu 5050 矩阵快速幂

来源:互联网 发布:交换机端口标签 编辑:程序博客网 时间:2024/05/01 21:48
题目大意:

有一种矩阵,它的第一行是这样一些数:a  0,0 = 0, a 0,1 = 233,a 0,2 = 2333,a 0,3 = 23333...) 除此之外,在这个矩阵里, 我们有 a i,j = a i-1,j +a i,j-1( i,j ≠ 0).现在给你 a 1,0,a 2,0,...,a n,0, 你能告诉我a n,m 是多少吗?


存一下自己写的用数组实现矩阵快速幂的模板。(以前都用挑战上的vector的模板,那个太慢了


#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>#include <string>#include <vector>#include <stack>#include <map>#include <queue>#include <set>#include <algorithm>using namespace std;typedef long long ll;int n;const ll MOD = 10000007;ll a[15];struct matrix{    ll mat[13][13];};matrix operator * (matrix a, matrix b){    matrix c;    memset(c.mat,0,sizeof(c.mat));    for(int i = 0; i <= n; ++i)        for(int k = 0; k <= n; ++k)            for(int j = 0; j <= n; ++j)                c.mat[i][j] = (c.mat[i][j] + a.mat[i][k] * b.mat[k][j] % MOD) % MOD;    return c;}matrix pow(matrix a, ll k){    matrix res;    memset(res.mat,0,sizeof(res.mat));    for(int i = 0; i <= n; ++i)        for(int j = 0; j <= n; ++j)            res.mat[i][j] = (i == j);    while(k > 0)    {        if(k & 1)            res = res*a;        a = a*a;        k >>= 1;    }    return res;}int main(){    ll m;    while(~scanf("%d%I64d", &n, &m))    {        memset(a,0,sizeof(a));        for(int i = 1; i <= n; ++i)        {            scanf("%I64d",&a[i]);        }        if(m == 0)        {            printf("%I64d\n",a[n]%MOD);            continue;        }        else        {            a[0] = 233ll;            for(int i = 1; i <= n; ++i)                a[i] = (a[i] + a[i-1])%MOD;            a[++n] = 3ll;            matrix x;            memset(x.mat,0,sizeof(x.mat));            for(int i = 0; i <= n; ++i)            {                if(i != n)                {                    x.mat[i][0] = 10ll;                    for(int j = 1; j <= i; ++j)                    {                        x.mat[i][j] = 1ll;                    }                }                x.mat[i][n] = 1ll;            }            x = pow(x,m-1);            ll ans = 0;            for(int i = 0; i <= n; ++i)            {                ans = (ans + (x.mat[n-1][i] * a[i]) % MOD) % MOD;            }            printf("%I64d\n",ans);        }    }    return 0;}




0 0
原创粉丝点击