转载:http://blog.csdn.net/wdcjdtc/article/details/39318847

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

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

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

题意:给出一个矩阵的第一列和第一行(下标从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;
}

hdu 5015 矩阵快速幂(可用作模板)的更多相关文章

  1. 随手练——HDU 5015 矩阵快速幂

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5015 看到这个限时,我就知道这题不简单~~矩阵快速幂,找递推关系 我们假设第一列为: 23 a1 a2 ...

  2. hdu 5015(矩阵快速幂z )

    a[i][j] = a[i-1][j] + a[i][j-1] m.特别大,可以计算出第一列,找出规律,构建一个特殊的矩阵,运用快速幂 设矩阵x: 1 0 0 0 ... |10 1 1 1 0 0 ...

  3. hdu 2604 矩阵快速幂模板题

    /* 矩阵快速幂: 第n个人如果是m,有f(n-1)种合法结果 第n个人如果是f,对于第n-1和n-2个人有四种ff,fm,mf,mm其中合法的只有fm和mm 对于ffm第n-3个人只能是m那么有f( ...

  4. HDU - 1575——矩阵快速幂问题

    HDU - 1575 题目: A为一个方阵,则Tr A表示A的迹(就是主对角线上各项的和),现要求Tr(A^k)%9973.  Input数据的第一行是一个T,表示有T组数据. 每组数据的第一行有n( ...

  5. HDU 2855 (矩阵快速幂)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2855 题目大意:求$S(n)=\sum_{k=0}^{n}C_{n}^{k}Fibonacci(k)$ ...

  6. HDU 4471 矩阵快速幂 Homework

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4471 解题思路,矩阵快速幂····特殊点特殊处理····· 令h为计算某个数最多须知前h个数,于是写 ...

  7. Luogu P3390 【模板】矩阵快速幂&&P1939 【模板】矩阵加速(数列)

    补一补之前的坑 因为上次关于矩阵的那篇blog写的内容太多太宽泛了,所以这次把一些板子和基本思路理一理 先看这道模板题:P3390 [模板]矩阵快速幂 首先我们知道矩阵乘法满足结合律而不满足交换律的一 ...

  8. hdu 1757 (矩阵快速幂) 一个简单的问题 一个简单的开始

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1757 题意不难理解,当x小于10的时候,数列f(x)=x,当x大于等于10的时候f(x) = a0 * ...

  9. HDU 3802 矩阵快速幂 化简递推式子 加一点点二次剩余知识

    求$G(a,b,n,p) = (a^{\frac {p-1}{2}}+1)(b^{\frac{p-1}{2}}+1)[(\sqrt{a} + \sqrt{b})^{2F_n} + (\sqrt{a} ...

随机推荐

  1. Hadoop回收站及fs.trash参数详解

    前言: Linux系统里,个人觉得最大的不方便之一就是没有回收站的概念.rm -rf很容易造成极大的损失.而在Hadoop或者说HDFS里面,有trash(回收站)的概念,可以使得数据被误删以后,还可 ...

  2. JS 九宫格算法 用原生js实现

    九宫格算法核心: 利用控件索引index计算出控件所在的行数和列数: 利用控件计算出left距离: 利用控件计算出top距离: 写特效时需要用到定位 公式: 行 row=parseInt(i/cols ...

  3. 实数类型c++

    数据类型 定义标识符 数值范围 占字节数 有效位数 单精度浮点数 float -3.4E+38-3.4E+38 4(32位) 6-7位 双精度浮点数 double -1.7E+308-1.7E+308 ...

  4. ASP.NET 知识点总结(六)

    1.传入某个属性的set方法的隐含参数的名称是什么?value,它的类型和属性所声名的类型相同. 2.如何在C#中实现继承? 在类名后加上一个冒号,再加上基类的名称.3.C#支持多重继承么? 类之间不 ...

  5. GIt学习之路 第二天 创建版本库

    本文参考廖雪峰老师的博客进行总结,完整学习请转廖雪峰博客 创建版本库 阅读: 1859216 什么是版本库呢?版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文 ...

  6. Visual Studio Code -VS Code

    VS Code 免费开源的编辑器,支持 windows. mac. Linux. 微软出品 官网:https://code.visualstudio.com/ 下载地址:https://code.vi ...

  7. NodeJs学习记录(三)vscode下启动一个nodejs的web工程

    2017/01/23 星期一 前言:根据手上现成的一个web工程来学习 1.配置vscode使其可以识别nodejs的页面文件.ejs 2.先把项目拖拽至vscode的编辑界面,在"查看&q ...

  8. Android Error:Unable to find method 'com.android.build.gradle.api.BaseVariant.getOutputs()Ljava/util/List;'.

    问题:Error:Unable to find method 'com.android.build.gradle.api.BaseVariant.getOutputs()Ljava/util/List ...

  9. python对象以及pickle腌制

    #python对象 1.什么是python的对象 2.详解pickle腌制 1.什么是python的对象 Python的内置的对象类型主要有数字.字符串.列表.元组.字典.集合等等.其实,在pytho ...

  10. swift Hashable Equatable

    /// You can use any type that conforms to the `Hashable` protocol in a set or /// as a dictionary ke ...