欢迎访问~原文出处——博客园-zhouzhendong

去博客园看该题解


题目传送门 - HDU3306


题意概括

  A0=1,A1=1,AN=X*AN-1+Y*AN-2(N>=2).求SN,SN=A02+A12+…+An2.


题解

  这题是用矩阵做的,一看(sou)就知道。

  设si为前i项的答案。

  如果要求第i项的ai那么是很简单的。

  构建矩阵:

       ai-1       ai

  ai-2    0      y

  ai-1    1      x

  但是好像没用。

  没错,的确没用。

  我们从二次项考虑:

  si  =si-1+ai2

        =si-1+(xai-1+yai-2)2

     =si-1+x2ai-12+y2ai-22+2xyai-1ai-2

  那么对于ak2形式的已经可以完成递推了。但是有一个棘手的东西,就是akak-1怎么完成递推?

  我们继续推导:

  akak-1=(xak-1+yak-2)ak-1

      =xak-12+yak-1ak-2

  我们发现ak-12和ak-1ak-2这两个其实可以按照之前推出来的推,而且不影响后面的。

  于是,我们可以构建递推矩阵:

       si      ai2    ai-12    aiai-1

  si-1        1      0        0      0

  ai-12    x2     x2      1      x

  ai-22    x2     y2      0      0

  ai-1ai-2   2xy    2xy     0      y

  

  意义:

  si    = si-1+x2ai-12+y2ai-22+2xyai-1ai-2

  ai2  =        x2ai-12+y2ai-22+2xyai-1ai-2

  ai-1    =           ai-12

  aiai-1   =         xai-12+                yai-1ai-2

  

  那么原始矩阵的第一行就是

  s1   a12   a02   a1a0

  算出sn,就是把这个原始矩阵乘上n-1个递推矩阵。

  


代码

#include <cstring>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <cstdlib>
using namespace std;
const int mod=10007,m=4;
struct Mat{
int v[m][m];
Mat (){}
Mat (int x){
(*this).set(x);
}
void print(){
for (int i=0;i<m;i++,puts(""))
for (int j=0;j<m;j++)
printf("%5d ",v[i][j]);
puts("");
}
void set(int x){
memset(v,0,sizeof v);
if (x==1)
for (int i=0;i<m;i++)
v[i][i]=1;
}
Mat operator * (Mat x){
Mat ans(0);
for (int i=0;i<m;i++)
for (int j=0;j<m;j++)
for (int k=0;k<m;k++)
ans.v[i][j]=(ans.v[i][j]+v[i][k]*x.v[k][j])%mod;
return ans;
}
void operator *= (Mat x){
(*this)=(*this)*x;
}
}M,Md;
Mat MatPow(Mat x,int y){
Mat ans(1),now=x;
while (y){
if (y&1)
ans*=now;
now*=now;
y>>=1;
}
return ans;
}
int n,x,y;
int main(){
while (~scanf("%d%d%d",&n,&x,&y)){
x%=mod,y%=mod;
M.set(0);
int newi[m]={2,1,1,1};
int newd[m][m]={{1 ,0 ,0,0},
{x*x%mod ,x*x%mod ,1,x},
{y*y%mod ,y*y%mod ,0,0},
{2*x*y%mod ,2*x*y%mod ,0,y}};
memcpy(M.v[0],newi,sizeof newi);
memcpy(Md.v,newd,sizeof newd);
Md=MatPow(Md,n-1);
M*=Md;
printf("%d\n",M.v[0][0]);
}
return 0;
}

  

HDU3306 Another kind of Fibonacci 矩阵的更多相关文章

  1. hdu 1588(Fibonacci矩阵求和)

    题目的大意就是求等差数列对应的Fibonacci数值的和,容易知道Fibonacci对应的矩阵为[1,1,1,0],因为题目中f[0]=0,f[1]=1,所以推出最后结果f[n]=(A^n-1).a, ...

  2. BZOJ3286 Fibonacci矩阵 矩阵 快速幂 卡常

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ3286 题意概括 n,m,a,b,c,d,e,f<=10^1000000 题解 神奇的卡常题目 ...

  3. hdu3306 Another kind of Fibonacci【矩阵快速幂】

    转载请注明出处:http://www.cnblogs.com/KirisameMarisa/p/4187670.html 题目链接:http://acm.hdu.edu.cn/showproblem. ...

  4. POJ3070 Fibonacci[矩阵乘法]

    Fibonacci Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 13677   Accepted: 9697 Descri ...

  5. 【全国互虐】Fibonacci矩阵

    orz啊又被屠了 人生如此艰难 题意: 给定一个k维的n^k的超立方体 超立方体的元素Ai1,i2,...,ik 的值为f(i1+i2+...+ik-k+1) f为斐波那契数列 求该超立方体的所有元素 ...

  6. poj 3070 Fibonacci (矩阵快速幂乘/模板)

    题意:给你一个n,输出Fibonacci (n)%10000的结果 思路:裸矩阵快速幂乘,直接套模板 代码: #include <cstdio> #include <cstring& ...

  7. poj 3070 Fibonacci 矩阵快速幂

    Description In the Fibonacci integer sequence, F0 = 0, F1 = 1, and Fn = Fn − 1 + Fn − 2 for n ≥ 2. F ...

  8. HDU 3306 Another kind of Fibonacci(矩阵+ll超时必须用int&输入必须取模&M必须是int类型)

    Another kind of Fibonacci [题目链接]Another kind of Fibonacci [题目类型]矩阵+ll超时必须用int&输入必须取模&M必须是int ...

  9. POJ3070 Fibonacci[矩阵乘法]【学习笔记】

    Fibonacci Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 13677   Accepted: 9697 Descri ...

随机推荐

  1. 逆向安全基础之IDA使用简介

    转载:http://m.blog.csdn.net/ilnature2008/article/details/54912854 IDA简介 IDA是业界一个功能十分强大的反汇编工具,是安全渗透人员进行 ...

  2. js计算数字长度

    js调用toString方法转为字符串后取长度 var num = 123; alert(num.toString().length);

  3. 前序遍历and中序遍历and后序遍历

    根据根节点的出现的时间确定前.中.后遍历. 1: 前序遍历首先访问根结点然后遍历左子树,最后遍历右子树.在遍历左.右子树时,仍然先访问根结点,然后遍历左子树,最后遍历右子树. 前序遍历结果:ABDEC ...

  4. 理解django框架中的MTV与MVC模式

    1.Models:一个抽象层,用来构建和操作你的web应用中的数据,模型是你的数据的唯一的.权威的信息源.它包含你所储存数据的必要字段和行为.通常,每个模型对应数据库中唯一的一张表. from dja ...

  5. Javascript定义变量

    在JavaScript中通过var来定义变量,不管是数字还是字符串,都可以通过这种方式来定义:我们既可以在声明变量的同时给变量赋值,也可以先声明变量,再给变量赋值. <script> va ...

  6. VS2012 安装番茄插件

    1.visual assist x 1929_大番茄.rar 下载地址: http://pan.baidu.com/s/1qXOUuJE 网盘提取密码: 3mka 文件解压密码: eg5p 2.安装完 ...

  7. WPS 表格筛选两列相同数据-完美-2017年11月1日更新

    应用: 1.选出A列中的数据是否在B列中出现过: 2.筛选出某一批序号在一个表格里面的位置(整批找出) 3.其实还有其他很多应用,难描述出来... ... A列中有几百的名字,本人想帅选出B列中的名字 ...

  8. 一:对程序员来说CPU是什么?

    0.开篇    (1)程序是什么?          指示计算机每一步动作的一组指令     (2)程序是由什么组成的?          指令和数据     (3)什么是机器语言?         ...

  9. Mybatis进阶学习笔记——关系查询——一对多查询

    一个客户拥有多个订单 <resultMap type="User" id="UserOrderResultMap"> <id column=& ...

  10. Python3 日期时间 相关模块(time(时间) / datatime(日期时间) / calendar(日历))

    Python3 日期时间 相关模块(time(时间) / datatime(日期时间) / calendar(日历)) 本文由 Luzhuo 编写,转发请保留该信息. 原文: http://blog. ...