本篇题解用于作者本人对于矩阵乘法的印象加深,也欢迎大家的阅读。


题目大意

众所周知,斐波那契数列为 \(f(0)=1\) , \(f(1)=1\) ,\(f(n)=f(n-1)+f(n-2)~(n>=2)\) 。

定义另一种斐波那契数列: \(A(0)=1\) , \(A(1)=1\) , \(A(n)=x*A(n-1)+y*A(n-2)~(n>=2)\) 。

我们要计算 \(S(n)\) , \(S(n)=A(0)^2+A(1)^2+...+A(n)^2\) 。

题解

我们可以很轻易的发现这是一道矩阵乘法的题,因为他是求关于一个递推式的平方和,而本题的难点就在于如何构建出合适的加速矩阵。

本题求的是 \(S(n)\) ,所以我们可以从 \(S(n)\) 递推式入手。

\[S(n)=S(n-1)+A^2(n)
\]

所以, \(A^2(n)\) 肯定要列入我们的矩阵中。我们再来看看 \(A^2(n)\) 的递推式:

\[\begin{array}{}
A^2(n)=(x*A(n-1)+y*A(n-2))^2\\
\\
=x^2A^2(n-1)+2xyA(n-1)A(n-2)+y^2A^2(n-2)\\
\end{array}
\]

所以, \(A^2(n)\) , \(A(n)A(n-1)\) 和 \(A^2(n-1)\) 也是需要加入矩阵的。因此我们的状态矩阵就是:

\[\left[\begin{matrix}
S(n)&A^2(n)&A^2(n-1)&A(n)A(n-1)\\
\end{matrix}\right]
\]

其中每一个元素的递推式如下:

\[\begin{array}{}
S(n)=S(n-1)+x^2A^2(n-1)+2xyA(n-1)A(n-2)+y^2A^2(n-2)\\
\\
A^2(n)=x^2A^2(n-1)+2xyA(n-1)A(n-2)+y^2A^2(n-2)\\
\\
A^2(n-1)=A^2(n-1)\\
\\
A(n)A(n-1)=xA^2(n-1)+yA(n-1)A(n-2)
\end{array}
\]

我们再根据状态矩阵以及状态矩阵元素的递推式,我们可以求出加速矩阵:

\[\left[\begin{matrix}
1&0&0&0\\
x^2&x^2&1&x\\
y^2&y^2&0&0\\
2xy&2xy&0&y\\
\end{matrix}\right]
\]

即:

\[\begin{array}{}
\left[\begin{matrix}
S(n-1)&A^2(n-1)&A^2(n-2)&A(n-1)A(n-2)\\
\end{matrix}\right]
*
\left[\begin{matrix}
1&0&0&0\\
x^2&x^2&1&x\\
y^2&y^2&0&0\\
2xy&2xy&0&y\\
\end{matrix}\right]
=
\left[\begin{matrix}
S(n)&A^2(n)&A^2(n-1)&A(n)A(n-1)\\
\end{matrix}\right]\\

\end{array}
\]

最后我们再套一个矩阵快速幂的模板就可以了。

代码如下:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int MOD=10007;
struct Matrix
{
int n,m;
ll h[5][5];
Matrix()
{
memset(h,0,sizeof(h));
}
void Re1(int a)
{
n=m=a;
memset(h,0,sizeof(h));
for(int i=1;i<=a;++i)
h[i][i]=1;
}
};
Matrix operator * (const Matrix a,const Matrix b)
{
Matrix ans;
ans.n=a.n;
ans.m=b.m;
for(int i=1;i<=a.n;++i)
{
for(int j=1;j<=b.m;++j)
{
for(int k=1;k<=a.m;++k)
{
ans.h[i][j]+=a.h[i][k]*b.h[k][j]%MOD;
ans.h[i][j]%=MOD;
}
}
}
return ans;
}
Matrix operator ^ (const Matrix xx,const ll kk)
{
Matrix ans,x=xx;
ll k=kk;
ans.Re1(4);
while(k>0)
{
if(k&1)
ans=ans*x;
x=x*x;
k>>=1;
}
return ans;
}
int n;
ll x,y;
Matrix tmp,stp,ans;
int main()
{
tmp.n=1;
tmp.m=4;
tmp.h[1][1]=2;
tmp.h[1][2]=1;
tmp.h[1][3]=1;
tmp.h[1][4]=1;
while(cin>>n>>x>>y)
{
stp.n=stp.m=4;
stp.h[1][1]=stp.h[2][3]=1;
stp.h[2][1]=stp.h[2][2]=x*x%MOD;
stp.h[3][1]=stp.h[3][2]=y*y%MOD;
stp.h[4][1]=stp.h[4][2]=2*x*y%MOD;
stp.h[2][4]=x;
stp.h[4][4]=y;
ans=tmp*(stp^(n-1));
printf("%lld\n",ans.h[1][1]);
}
}

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

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

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

  2. HDU3306 Another kind of Fibonacci 矩阵

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - HDU3306 题意概括 A0=1,A1=1,AN=X*AN-1+Y*AN-2(N>=2).求SN,SN ...

  3. HDU3306—Another kind of Fibonacci

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3306 题目意思:一个斐波那契数列的变式,本来是A[n]=A[n-1]+A[n-2],现在变成A[n]= ...

  4. Another kind of Fibonacci(hdu3306)

    Another kind of Fibonacci Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  5. hdu3306:Another kind of Fibonacci

    A(0)=A(1)=1,A(i)=X*A(i-1)+Y*A(i-2),求S(n)=A(0)^2+A(1)^2+A(2)^2+A(3)^2+……+A(n)^2. 这个矩阵有点毒.. #include&l ...

  6. 算法与数据结构(九) 查找表的顺序查找、折半查找、插值查找以及Fibonacci查找

    今天这篇博客就聊聊几种常见的查找算法,当然本篇博客只是涉及了部分查找算法,接下来的几篇博客中都将会介绍关于查找的相关内容.本篇博客主要介绍查找表的顺序查找.折半查找.插值查找以及Fibonacci查找 ...

  7. #26 fibonacci seqs

    Difficulty: Easy Topic: Fibonacci seqs Write a function which returns the first X fibonacci numbers. ...

  8. 关于java的递归写法,经典的Fibonacci数的问题

    经典的Fibonacci数的问题 主要想展示一下迭代与递归,以及尾递归的三种写法,以及他们各自的时间性能. public class Fibonacci { /*迭代*/ public static ...

  9. 斐波拉契数列(Fibonacci) 的python实现方式

    第一种:利用for循环 利用for循环时,不涉及到函数,但是这种方法对我种小小白来说比较好理解,一涉及到函数就比较抽象了... >>> fibs = [0,1] >>&g ...

随机推荐

  1. Andrew Ng 机器学习公开课 - 线性回归

    我的机器学习系列从现在开始将会结合Andrew Ng老师与sklearn的api是实际应用相结合来写了. 吴恩达(1976-,英文名:Andrew Ng),华裔美国人,是斯坦福大学计算机科学系和电子工 ...

  2. Java POI 导出带有图片的word

    1. 引入maven ,具体可以上github看一下,这里做简单的说明,是一个大神封装了一下 官方提供的语法 文本语法是 {{Text}} 图片语法是{{@Image}} 其他的自己去看官方文档 &l ...

  3. No matching distribution found for Tensorflow

    No matching distribution found for Tensorflow 原因:python 3.7.3 版本过高 解决:安装3.6  64位

  4. 对于线程池ThreadPool的学习总结

    线程池:就是一个管理线程的池子. 优点: 它帮我们管理线程,避免增加创建线程和销毁线程的资源损耗.因为线程其实也是一个对象,创建一个对象,需要经过类加载过程,销毁一个对象,需要走GC垃圾回收流程,都是 ...

  5. 金九银十想面BAT?那这些JDK 动态代理的面试点你一定要知道

    一.什么是代理 代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问.代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理. 代理模式UM ...

  6. 深度分享:面试阿里,字节跳动,美团90%会被问到的HashMap知识

    一,HashTable 哈希表,它相比于hashMap结构简单点,它没有涉及红黑树,直接使用链表的方式解决哈希冲突. 我们看它的字段,和hashMap差不多,使用table存放元素 private t ...

  7. Android ALSPS驱动分析

    一.alsps的初始化函数和重要结构体 epl2182_init // Epl2182.c (kernel-3.10\drivers\misc\mediatek\alsps\epl2182-new) ...

  8. 自定义 JSTLFunction

    复习常用JSTL Function为什么需要自定义Function如何自定义Function,例子:1.在独立的项目中(也可以在web项目中)的类中(比如Functions)编写一个static方法: ...

  9. Jmeter(二十九) - 从入门到精通 - Jmeter Http协议录制脚本工具-Badboy2(详解教程)

    1.简介 上一篇文中已经对Badboy做了一个基本上详细完整的介绍,这一篇宏哥带你们实战一下,这一篇主要讲解和分享:录制和运行脚本.参数化 首先让我们使用N模式录制一个脚本,测试用例编号为:1.1.1 ...

  10. 【抓取】6-DOF GraspNet 论文解读

    [抓取]6-DOF GraspNet 论文解读 [注]:本文地址:[抓取]6-DOF GraspNet 论文解读 若转载请于明显处标明出处. 前言 这篇关于生成抓取姿态的论文出自英伟达.我在读完该篇论 ...