a[i][j] = a[i-1][j] + a[i][j-1]

m.特别大,可以计算出第一列,找出规律,构建一个特殊的矩阵,运用快速幂

设矩阵x:

1 0 0 0 ... |10 1

1 1 0 0 ... |10 1

1 1 1 0 ...  |10 1

1 1 1 1 ...   |10 1

......      ...  | ...

0 0 0 0 ... |10 1

0 0 0 0 ... | 0 1

用最后两行来实现 233.....,求出x*第一列 = 第二列 。

所以最终答案 = x ^ m * 第一列  (矩阵的运用很灵活)

#include <cstdio>
#include <cstring>
#define mod 10000007
typedef long long ll;
int n;
struct mat
{
ll q[16][16];
mat()
{
memset(q,0,sizeof(q));
}
}; mat mat_mul(mat a,mat b)
{
mat re;
for(int i=0; i<=n; i++)
{
for(int j=0; j<=n; j++)
{
for(int k=0; k<=n; k++)
{
re.q[i][j]+=a.q[i][k]*b.q[k][j];
re.q[i][j]%=mod;
}
}
}
return re;
} mat mat_pow(mat m,int num)
{
mat re;
mat tmp=m;
for(int i=0; i<=n; i++)
{
re.q[i][i]=1;
}
while(num)
{
if(num&1)
{
re=mat_mul(re,tmp);
}
tmp=mat_mul(tmp,tmp);
num>>=1;
}
return re;
} int main()
{
int m;
while(scanf("%d%d",&n,&m) != EOF)
{
mat p,orz;
for(int i = 0; i < n; i++)
scanf("%I64d",&p.q[i][0]);
p.q[n][0] = 23;
n++;
p.q[n][0] = 3; for(int i=0; i<n-1; i++)
{
for(int j=0; j<=i; j++)
{
orz.q[i][j]=1;
}
orz.q[i][n-1]=10;
orz.q[i][n]=1;
}
orz.q[n][n] = orz.q[n-1][n] = 1;
orz.q[n-1][n-1] = 10; mat tmp = mat_pow(orz,m);
mat ans= mat_mul(tmp,p); printf("%I64d\n",ans.q[n-2][0]);
}
return 0;
}

  

hdu 5015(矩阵快速幂z )的更多相关文章

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

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

  2. hdu 5015 矩阵快速幂(可用作模板)

    转载:http://blog.csdn.net/wdcjdtc/article/details/39318847 之前各种犯傻 推了好久这个东西.. 后来灵关一闪  就搞定了.. 矩阵的题目,就是构造 ...

  3. HDU 2855 (矩阵快速幂)

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

  4. HDU 4471 矩阵快速幂 Homework

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

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

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

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

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

  7. 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} ...

  8. How many ways?? HDU - 2157 矩阵快速幂

    题目描述 春天到了, HDU校园里开满了花, 姹紫嫣红, 非常美丽. 葱头是个爱花的人, 看着校花校草竞相开放, 漫步校园, 心情也变得舒畅. 为了多看看这迷人的校园, 葱头决定, 每次上课都走不同的 ...

  9. HDU 5950 矩阵快速幂

    Recursive sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

随机推荐

  1. Bate敏捷冲刺每日报告--day3

    1 团队介绍 团队组成: PM:齐爽爽(258) 小组成员:马帅(248),何健(267),蔡凯峰(285)  Git链接:https://github.com/WHUSE2017/C-team 2 ...

  2. 详谈C++虚函数表那回事(一般继承关系)

    沿途总是会出现关于C++虚函数表的问题,今天做一总结: 1.什么是虚函数表: 虚函数(Virtual Function)是通过一张虚函数表(Virtual Table)来实现的.简称为V-Table. ...

  3. 利用python 创建XML文件

    #coding=utf-8 from xml.etree import ElementTree import pdb def printNodeInfo(node): #node.tag 标签名称 # ...

  4. shell中冒号 : 用途说明

    我们知道,在Linux系统中,冒号(:)常用来做路径的分隔符(PATH),数据字段的分隔符(/etc/passwd)等.其实,冒号(:)在Bash中也是一个内建命令,它啥也不做,是个空命令.只起到占一 ...

  5. JAVA_SE基础——9.基本数据类型间的转换

    前面我已经教会大家基本的数据类型进行了介绍,   然后这篇文章,我来介绍下,基本数据类型的转换. Java中有两种类型转换形式,分别是自动类型转换和强制类型转换. Step1.自动类型转换. 自动类型 ...

  6. Python之旅.第三章.函数4.01/4.02

    一.三元表达式 #普通的判断大小函数def max2(x,y): if x > y: return x else: return yres=max2(10,11)print(res)x=12y= ...

  7. ArrayList源码学习----JDK1.7

    什么是ArrayList? ArrayList是存储一组数据的集合,底层也是基于数组的方式实现,实际上也是对数组元素的增删改查:它的主要特点是: 有序:(基于数组实现) 随机访问速度快:(进行随机访问 ...

  8. python pickle 模块的使用

    用于序列化的两个模块 json:用于字符串和Python数据类型间进行转换 pickle: 用于python特有的类型和python的数据类型间进行转换 json提供四个功能:dumps,dump,l ...

  9. ELK学习总结(2-2)单模式CRUD操作

    ------------------------------------------------------ 1.查看索引信息 请求命令: GET /library/_settings GET /li ...

  10. Stanford依存句法关系解释

    ROOT:要处理文本的语句 IP:简单从句 NP:名词短语 VP:动词短语 PU:断句符,通常是句号.问号.感叹号等标点符号 LCP:方位词短语 PP:介词短语 CP:由'的'构成的表示修饰性关系的短 ...