1070 普通递归关系

 时间限制: 1 s
 空间限制: 128000 KB
 题目等级 : 大师 Master
 
 
题目描述 Description

考虑以下定义在非负整数n上的递归关系

f(n) = f0 (if n = 0)

= f1 (if n = 1)

= a*f(n-1)+b*f(n-2)  otherwise

其中a,b是满足以下两个条件的常数:

(1) a2+4b>0

(2) |a-sqrt(a2+4b)| <= 2   // sqrt是根号的意思

给定f0,f1, a, b和n,请你写一个程序计算fn,可以假定fn是绝对值不超过109的整数(四舍五入)。

输入描述 Input Description

输入文件一行依次给出5个数,f0, f1, a, b和n, f0,f1是绝对值不超过109,n是非负整数,不超过109。另外,a、b是满足上述条件的实数,且|a|,|b|<=106。

输出描述 Output Description

输出f(n)

样例输入 Sample Input

【样例输入1】

0 1 1 1 20

【样例输入2】

0 1 -1 0 1000000000

【样例输入3】

-1 1 4 -3 18

样例输出 Sample Output

【样例输出1】

6765

【样例输出2】

-1

【样例输出3】

387420487

联想斐波那契数列,容易得到

a    b         f(n-1)           a*f(n-1)+b*f(n-2)=f(n)

*                 =

1    0         f(n-2)           f(n-1)

所以

f(n)             a     b                      f(1)

=                   ^(n-1)   *

f(n-1)          1     0                      f(0)

这里没有必要写两个函数,

一个函数,保证ans的第一列是正确的即可

#include<cstdio>
using namespace std;
int n;
double aa,b,f0,f1;
double a[][],ans[][],tmp[][];
void mul1(double s1[][],double s2[][])
{
for(int i=;i<=;i++)
for(int j=;j<=;j++)
{
tmp[i][j]=;
for(int k=;k<=;k++)
tmp[i][j]+=s1[i][k]*s2[k][j];
}
for(int i=;i<=;i++)
for(int j=;j<=;j++)
s1[i][j]=tmp[i][j];
}
void mul2(double s1[][],double s2[][])
{
for(int i=;i<=;i++)
{
tmp[i][]=;
for(int k=;k<=;k++)
tmp[i][]+=s1[i][k]*s2[k][];
}
for(int i=;i<=;i++) s2[i][]=tmp[i][]; }
int main()
{
scanf("%lf%lf%lf%lf%d",&f0,&f1,&aa,&b,&n);
if(!n)
{
printf("%.0lf",f0); return ;
}
if(n==)
{
printf("%.0lf",f1); return ;
}
if(f1==&&f0==)//神数据
{
printf("");
return ;
}
a[][]=aa; a[][]=b; a[][]=; a[][]=;
ans[][]=f1; ans[][]=f0;
n--;
for(;n;n>>=,mul1(a,a))
if(n&) mul2(a,ans);
printf("%.0lf",ans[][]);
}

codevs 1070 普通递归关系的更多相关文章

  1. Codevs 1070 普通递归关系(矩阵乘法)

    1070 普通递归关系 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 考虑以下定义在非负整数n上的递归关系 f(n) = f0 ...

  2. codevs 3289 花匠

    题目:codevs 3289 花匠 链接:http://codevs.cn/problem/3289/ 这道题有点像最长上升序列,但这里不是上升,是最长"波浪"子序列.用动态规划可 ...

  3. codevs 1082 线段树练习 3(区间维护)

    codevs 1082 线段树练习 3  时间限制: 3 s  空间限制: 128000 KB  题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区 ...

  4. codevs 1285 二叉查找树STL基本用法

    C++STL库的set就是一个二叉查找树,并且支持结构体. 在写结构体式的二叉查找树时,需要在结构体里面定义操作符 < ,因为需要比较. set经常会用到迭代器,这里说明一下迭代器:可以类似的把 ...

  5. codevs 1576 最长上升子序列的线段树优化

    题目:codevs 1576 最长严格上升子序列 链接:http://codevs.cn/problem/1576/ 优化的地方是 1到i-1 中最大的 f[j]值,并且A[j]<A[i] .根 ...

  6. codevs 1080 线段树点修改

    先来介绍一下线段树. 线段树是一个把线段,或者说一个区间储存在二叉树中.如图所示的就是一棵线段树,它维护一个区间的和. 蓝色数字的是线段树的节点在数组中的位置,它表示的区间已经在图上标出,它的值就是这 ...

  7. codevs 1228 苹果树 树链剖分讲解

    题目:codevs 1228 苹果树 链接:http://codevs.cn/problem/1228/ 看了这么多树链剖分的解释,几个小时后总算把树链剖分弄懂了. 树链剖分的功能:快速修改,查询树上 ...

  8. codevs 1082 线段树区间求和

    codevs 1082 线段树练习3 链接:http://codevs.cn/problem/1082/ sumv是维护求和的线段树,addv是标记这歌节点所在区间还需要加上的值. 我的线段树写法在运 ...

  9. codevs 1052 地鼠游戏

    1052 地鼠游戏 http://codevs.cn/problem/1052/ 题目描述 Description 王钢是一名学习成绩优异的学生,在平时的学习中,他总能利用一切时间认真高效地学习,他不 ...

随机推荐

  1. wcf的DataContractAttribute与DataMenmberAttribute

    文章:序列化和反序列化的几种方式(DataContractSerializer)(二) 介绍了序列化控制细节.哪些字段可以序列化,序列化后这些字段的名字.

  2. java属性编辑器,即PropertyEditor

    出处:http://www.iteye.com/topic/1123628

  3. Ubuntu16.04 下虚拟环境的创建与使用

    1. 虚拟环境   虚拟环境(virtual environment),顾名思义是虚拟出来的环境,通俗来讲,可以借助虚拟机,docker来理解虚拟环境,就是把一部分内容独立出来,我们把这部分独立出来的 ...

  4. .NET项目中常用的32个正则表达式总结

    最近没事总结了下最近所用到的正则表达式,下面32个是经常用到的,总结下来与大家分享. . "^-?[1-9]\\d*$",//整数 . "^[1-9]\\d*$" ...

  5. background的使用

    先简单的介绍颜色表示法 一共有三种:单词,rgb表示法,十六进制表示法 rgb:红色 绿色 蓝色 三原色 光学显示器,每个像素都是有三原色的发光原件组成的,靠明亮度不同调成不同的颜色的 有逗号隔开,r ...

  6. C# Socket模拟发送接收

    Socket简介 通过TCP/IP与仪器或设备通讯,在C#语言中,我们通常采用Socket.本项目是一个简单的Socket建立服务监听与Socket作为客户端请求的一个示例. 项目结构 客户端项目 S ...

  7. HNOI/AHOI2018题解

    作为一名高二老年选手来补一下我省去年的省选题. D1T1:寻宝游戏 按顺序给出\(n\)个\(m\)位的二进制数\(a_i\),再在最前方添一个\(0\), 给出\(q\)次询问,每次询问给出一个同样 ...

  8. 【ActiveMQ】- 发布/订阅模式

    publish/subscribe 特点:A发送的消息可以被所有监听A的对象的接收,就好比学校的广播,所有的学生都可以收听校园广播信息. 消息生产者: package com.zhiwei.advan ...

  9. FourAndSix: 2.01靶机入侵

      0x01 前言 FourAndSix2是易受攻击的一个靶机,主要任务是通过入侵进入到目标靶机系统然后提权,并在root目录中并读取flag.tx信息 FourAndSix2.镜像下载地址: htt ...

  10. Linux内核分析实验六

    Linux内核分析实验六 进程控制块PCB——task_struct(进程描述符) 为了管理进程,内核必须对每个进程进行清晰的描述,进程描述符提供了内核所需了解的进程信息. struct task_s ...