[矩阵快速幂] hdu 5015 233 Matrix

之前各种犯傻 推了好久这个东西。。

后来灵关一闪  就搞定了。。

矩阵的题目,就是构造矩阵比较难想!

题意:给出一个矩阵的第一列和第一行(下标从0开始),(0,0)位置为0,

第一行为,233,2333,23333...一次加个3,

第一列为输入的n个数。

然后从(1,1)位置开始,等于上面的数加左边的数,问(n+1,m+1)的数是多少,也就是右下角的数

思路:

把矩阵画出来:

|   0     233   2333  |

|  b0     b1     b2     |

|  c0     c1     c2      |

|  d0     d1     d2     |

b1=233+b0,c1=b1+c0=233+b0+c0, d1=c1+d0=233+b0+c0+d0。

那么我们不妨设233为a0,a1=a0*10+3

这样每一项就都是由前面的项的得到了,因为有个常数3,所以再设一个常数1

那么我们就可以构造一个这样的矩阵

|   1    3     0    0    0   |

|   0   10   1    1     1   |

|  1  233  b0  c0 d0  |   *    |   0    0     1    1    1   |     =   |  1   2333  b1  c1  d1  |

|   0    0     0    1    1   |

|   0    0     0    0    1   |

这样就是递推下去,前面的乘上后面矩阵的m次方,输出ans.mat[0][n+1]  就ok了!

代码:

#include"cstdlib"
#include"cstdio"
#include"cstring"
#include"cmath"
#include"stack"
#include"algorithm"
#include"iostream"
using namespace std;
int m=10000007;
struct matrix
{
    __int64 mat[15][15];
};

matrix matmul(matrix a,matrix b,int n,int m)  //矩阵乘法    n阶矩阵a、b相乘对m取模
{
    int i,j,k;
    matrix c;
    memset(c.mat,0,sizeof(c.mat));
    for(i=0;i<n;i++)
    {
        for(j=0;j<n;j++)
        {
            for(k=0;k<n;k++)
            {
                c.mat[i][j]+=a.mat[i][k]*b.mat[k][j];
                c.mat[i][j]%=m;
            }
        }
    }
    return c;
}
matrix matpow(matrix a,int k,int n,int m)  //矩阵快速幂取模  n阶矩阵a的k次方对m取模
{
    matrix b;
    int i;
    memset(b.mat,0,sizeof(b.mat));
    for(i=0;i<n;i++) b.mat[i][i]=1;
    while(k)
    {
        if(k&1) b=matmul(a,b,n,m);
        a=matmul(a,a,n,m);
        k>>=1;
    }
    return b;
}
int main()
{
    int n,k;
    while(scanf("%d%d",&n,&k)!=-1)
    {
        int i,j;
        matrix a,b,ans;
        memset(a.mat,0,sizeof(a.mat));
        memset(b.mat,0,sizeof(b.mat));
        for(i=0;i<n;i++) scanf("%I64d",&a.mat[0][i+2]);
        a.mat[0][0]=1;
        a.mat[0][1]=233;
        b.mat[0][0]=1;
        b.mat[0][1]=3;
        b.mat[1][1]=10;
        for(i=2;i<=n+1;i++)
        {
            for(j=1;j<1+i;j++)
                b.mat[j][i]=1;
        }
        ans=matmul(a,matpow(b,k,n+2,m),n+2,m);
        printf("%I64d\n",ans.mat[0][n+1]);
    }
    return 0;
}
时间: 2024-10-12 21:46:48

[矩阵快速幂] hdu 5015 233 Matrix的相关文章

HDU 5015 233 Matrix(西安网络赛I题)

HDU 5015 233 Matrix 题目链接 思路:矩阵快速幂,观察没一列,第一个和为左边加最上面,第二个可以拆为左边2个加最上面,第三个可以拆为为左边3个加最上面,这样其实只要把每一列和每一列右边那列的233构造出一个矩阵,进行矩阵快速幂即可 代码: #include <cstdio> #include <cstring> typedef long long ll; const int N = 15; const int MOD = 10000007; int n, m; s

hdu 5015 233 Matrix(西安网络赛1009)【构造矩阵】

说起这题简直醉了..当时愣是没想到该怎么做,搞了好久,虽然有想过构造矩阵,但是没仔细想下去. 此题构造两个矩阵,假设a[]数组为题目给出的数据,最多有10个元素,我们可以构造一个矩阵A: a={a[1],a[2],a[3],...a[n],23,3}  大小为1*(n+2) 要得到题目需要的计算结果,那么在构造一个矩阵B,大小为(n+2)*(n+2):(假设n=3) b=   1    1    1    0    0 0    1    1    0    0 0    0    1    0

hdu 5015 233 Matrix

233 Matrix Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 392    Accepted Submission(s): 262 Problem Description In our daily life we often use 233 to express our feelings. Actually, we may s

矩阵快速幂——HDU 2604

对应HDU题目:点击打开链接 Queuing Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3114    Accepted Submission(s): 1419 Problem Description Queues and Priority Queues are data structures which are known t

矩阵快速幂 HDU 4565 So Easy!(简单?才怪!)

题目链接 题意: 思路: 直接拿别人的图,自己写太麻烦了~ 然后就可以用矩阵快速幂套模板求递推式啦~ 另外: 这题想不到或者不会矩阵快速幂,根本没法做,还是2013年长沙邀请赛水题,也是2008年Google Codejam Round 1A的C题. #include <bits/stdc++.h> typedef long long ll; const int N = 5; int a, b, n, mod; /* *矩阵快速幂处理线性递推关系f(n)=a1f(n-1)+a2f(n-2)+.

递推+矩阵快速幂 HDU 2065

1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 5 using namespace std; 6 7 //矩阵大小上限 8 const int SIZ=100; 9 int MOD=100; 10 11 //矩阵大小为n*m,初始化全部为0 12 struct mat 13 { 14 int n,m; 15 int ar[SIZ][SIZ]; 16 mat() 17 { 18 memset

矩阵快速幂 [HDU 4549] M斐波那契数列

M斐波那契数列 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 1609    Accepted Submission(s): 460 Problem Description M斐波那契数列F[n]是一种整数数列,它的定义如下: F[0] = aF[1] = bF[n] = F[n-1] * F[n-2] ( n > 1 ) 现在给出a,

hdu 5015 233 Matrix (矩阵快速幂)

233 Matrix Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 749    Accepted Submission(s): 453 Problem Description In our daily life we often use 233 to express our feelings. Actually, we may s

HDU 5015 233 Matrix(矩阵快速幂)

Problem Description In our daily life we often use 233 to express our feelings. Actually, we may say 2333, 23333, or 233333 ... in the same meaning. And here is the question: Suppose we have a matrix called 233 matrix. In the first line, it would be