题目

  Winder最近在学习fibonacci 数列的相关知识。我们都知道fibonacci数列的递推公式是F(n)=F(n-1)+F(n-2)(n>=2 且n 为整数)。 Winder想知道的是当我们将这个递推式改为F(n)=AF(n-1)+BF(n-2)(n>=2且n为整数)时我们得到的是怎样的数列。但是,Winder很懒,所以只能由你来帮他来完成这件事。 注意,这里我们依然令F(0)=F(1)=1。

★数据输入

  输入第一行三个正整数N,A 和B(N<=10;1<=A、B<=100 且均为整数)。 接下来有N 行,每行一个自然数n(n<=100000000)。

★数据输出

  输出一行一个整数F(n),由于结果可能会很大,Winder要求输出结果对2013取模。

输入示例 输出示例

5 4 5

2

4

8

16

32

9

209

1377

182

9

题解:

  一道很经典的矩阵快速幂裸题。

  首先讲解快速幂,当我们需要求$a^{b}$对mod取模时,可以将b转化为2进制,就可以将b转换为若干个二次幂之和。例如,我们在计算2的12次方时,12的二进制为1100,1100中的两个1的位权分别为4和8,因此$2^{12}$次方便可以转换为$2^{4}*2^{8}$。由此,我们先将答案ans赋值为1,只需要计算a的1,2,4,8.....次方,然后看一下b在该位的数值是否为1即可,如果为1,将ans乘上即可。

快速幂的代码如下

ll fastpow(ll a,ll b)
{
ll ans=;
while(b)
{
if(b&) ans=ans*a%mod;
a=a*a%mod;
b>>=;
}
return ans;
}

  接下来回到本题,由于n的数字较大,加上取模速度较慢,本题递归递推会超时。因此需要寻找复杂度小于O(n)的算法。

  由于

$
\left(
\begin{matrix}
a & b \\
1 & 0 
\end{matrix}
\right)*
\binom{f(n)}{f(n-1)}=\binom{f(n+1)}{f(n)}
$我们可以构造矩阵,可以得到

$$
\left(
\begin{matrix}
a & b \\
1 & 0
\end{matrix}
\right) \tag{2}^{n-1}*
\binom{f(1)}{f(0)}=\binom{f(n)}{f(n-1)}
$$

由此,我们只需要计算矩阵

$$
\left(
\begin{matrix}
a & b \\
1 & 0
\end{matrix}
\right)
$$

的n-1次方即可,对于这个矩阵的n-1次方,使用快速幂求出所求矩阵,便可以在$\log n$的时间内计算出f(n)的值。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<string>
#include<vector>
#include<queue>
#include<set>
using namespace std;
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
typedef pair <int,int> pii;
#define rep(i,x,y) for(int i=x;i<y;i++)
#define rept(i,x,y) for(int i=x;i<=y;i++)
#define per(i,x,y) for(int i=x;i>=y;i--)
#define pb push_back
#define fi first
#define se second
#define mes(a,b) memset(a,b,sizeof a)
const int inf=0x3f3f3f3f;
const int mod=;
class matrix
{
public:
int arrcy[][];//arrcy为矩阵,下表从0开始
int row,column;//row为矩阵的行,column为矩阵的列
friend matrix operator *(matrix s1,matrix s2)
{
int i,j;
matrix s3;
for (i=;i<s1.row;i++)
{
for (j=;j<s2.column;j++)
{
for (int k=;k<s1.column;k++)
{
s3.arrcy[i][j]+=s1.arrcy[i][k]*s2.arrcy[k][j];
s3.arrcy[i][j]%=mod;
}
}
}
s3.row=s1.row;
s3.column=s2.column;
return s3;
}
};
matrix quick_pow(matrix s1,long long n)//矩阵快速幂函数,s1为矩阵,n为幂次
{
matrix mul=s1,ans;
//将ans构造为单位矩阵
ans.row=ans.column=s1.row;
memset(ans.arrcy,,sizeof ans.arrcy);
for(int i=;i<ans.row;i++)
ans.arrcy[i][i]=;
while(n)
{
if(n&) ans=ans*mul;
mul=mul*mul;
n/=;
}
return ans;
} int main()
{
ios::sync_with_stdio(false);
cin.tie();
int n,a,b;
cin>>n>>a>>b;
matrix mul;
mul.row=mul.column=;
mul.arrcy[][]=a;
mul.arrcy[][]=b;
mul.arrcy[][]=;
mul.arrcy[][]=;
matrix r;
r.row=;
r.column=;
r.arrcy[][]=r.arrcy[][]=;
rep(i,,n)
{
int x;
cin>>x;
if(!x)//当x=1时,x-1<0无法使用快速幂,答案为0,特判即可
{
cout<<<<endl;
continue;
}
matrix mm=quick_pow(mul,x-);
mm=mm*r;
cout<<mm.arrcy[][]<<endl;
}
return ;
}

FZU2018级算法第一次作业 1.1fibonacci (矩阵快速幂)的更多相关文章

  1. bzoj 2326: [HNOI2011]数学作业【dp+矩阵快速幂】

    矩阵乘法一般不满足交换律!!所以快速幂里需要注意乘的顺序!! 其实不难,设f[i]为i的答案,那么f[i]=(f[i-1]w[i]+i)%mod,w[i]是1e(i的位数),这个很容易写成矩阵的形式, ...

  2. 【BZOJ】2004: [Hnoi2010]Bus 公交线路 状压DP+矩阵快速幂

    [题意]n个点等距排列在长度为n-1的直线上,初始点1~k都有一辆公车,每辆公车都需要一些停靠点,每个点至多只能被一辆公车停靠,且每辆公车相邻两个停靠点的距离至多为p,所有公车最后会停在n-k+1~n ...

  3. 【BZOJ】2553: [BeiJing2011]禁忌 AC自动机+期望+矩阵快速幂

    [题意]给定n个禁忌字符串和字符集大小alphabet,保证所有字符在集合内.一个字符串的禁忌伤害定义为分割能匹配到最多的禁忌字符串数量(一个可以匹配多次),求由字符集构成的长度为Len的字符串的期望 ...

  4. 【BZOJ】4861: [Beijing2017]魔法咒语 AC自动机+DP+矩阵快速幂

    [题意]给定n个原串和m个禁忌串,要求用原串集合能拼出的不含禁忌串且长度为L的串的数量.(60%)n,m<=50,L<=100.(40%)原串长度为1或2,L<=10^18. [算法 ...

  5. 算法设计与分析 1.2 不一样的fibonacci数列 (矩阵快速幂思想)

    题目描述 Winder 最近在学习 fibonacci 数列的相关知识.我们都知道 fibonacci 数列的递推公式是F(n) = F(n - 1) + F(n - 2)(n >= 2 且 n ...

  6. 【BZOJ1009】GT考试(KMP算法,矩阵快速幂,动态规划)

    [BZOJ1009]GT考试(KMP算法,矩阵快速幂,动态规划) 题面 BZOJ 题解 看到这个题目 化简一下题意 长度为\(n\)的,由\(0-9\)组成的字符串中 不含串\(s\)的串的数量有几个 ...

  7. 整数快速乘法/快速幂+矩阵快速幂+Strassen算法

    快速幂算法可以说是ACM一类竞赛中必不可少,并且也是非常基础的一类算法,鉴于我一直学的比较零散,所以今天用这个帖子总结一下 快速乘法通常有两类应用:一.整数的运算,计算(a*b) mod c  二.矩 ...

  8. 51nod 算法马拉松18 B 非010串 矩阵快速幂

    非010串 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 如果一个01字符串满足不存在010这样的子串,那么称它为非010串. 求长度为n的非010串的个数.(对1e9+7取模) ...

  9. BZOJ 1009 :[HNOI2008]GT考试(KPM算法+dp+矩阵快速幂)

    这道到是不用看题解,不过太经典了,早就被剧透一脸了 这道题很像ac自动机上的dp(其实就是) 然后注意到n很大,节点很小,于是就可以用矩阵快速幂优化了 时间复杂度为o(m^3 *log n); 蒟蒻k ...

随机推荐

  1. 2-ESP8266 SDK开发基础入门篇--非RTOS版与RTOS版

    https://www.cnblogs.com/yangfengwu/p/11071580.html 所有的源码 https://gitee.com/yang456/Learn8266SDKDevel ...

  2. JavaScript的入门篇

    快速认识JavaScript 熟悉JavaScript基本语法 窗口交互方法 通过DOM进行网页元素的操作 学会如何编写JS代码 运用JavaScript去操作HTML元素和CSS样式 <!DO ...

  3. Time of Trial

    Time of Trial(思维) 题目大意:一个人想逃,一个人要阻止那个人逃跑 ,阻止者念每一个符咒的时间为b[i],逃跑者念每一个符咒的时间为a[i],逃跑者如果念完了第i个符咒,阻止者还没有念完 ...

  4. 02-线性结构3 Reversing Linked List (25 分)

    Given a constant K and a singly linked list L, you are supposed to reverse the links of every K elem ...

  5. idea 导入 eclipse java ee 项目,并使用 tomcat 7 部署运行

    1.导入java ee项目.直接open 2.导入jar依赖 3.修改编译的目录 4.修改tomcat目录 5.tomcat添加目录 请注意classes单词 D:\project\xxxxxx\We ...

  6. TreeMap用法总结

    TreeMap用法总结 public class TreeMap<K,V> extends AbstractMap<K,V> implements NavigableMap&l ...

  7. 2019 SDN第6次上机作业

    1.作业要求: 作业链接 参考资料: Ryu控制器的API文档:ryu.app.ofctl_rest Ryu的拓扑展示 助教博客:基于RYU restful api实现的VLAN网络虚拟化 2.具体操 ...

  8. Kubernetes Pod概述

    Pod简介 Pod是Kubernetes创建或部署的最小/最简单的基本单位,一个Pod代表集群上正在运行的一个进程. 一个Pod封装一个应用容器,Pod代表部署的一个单位. Pods提供两种共享资源: ...

  9. 数据仓库DW、ODS、DM概念及其区别

    整体结构 在具体分析数据仓库之前先看下一下数据中心的整体架构以及数据流向   数据中心整体架构.png DB 是现有的数据来源,可以为mysql.SQLserver.文件日志等,为数据仓库提供数据来源 ...

  10. html 获取项目根路径

    html 获取项目根路径 function getContextPath(){ var pathName = document.location.pathname; //当前文件的绝度路径 var i ...