codevs 1070 普通递归关系
1070 普通递归关系
考虑以下定义在非负整数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的整数(四舍五入)。
输入文件一行依次给出5个数,f0, f1, a, b和n, f0,f1是绝对值不超过109,n是非负整数,不超过109。另外,a、b是满足上述条件的实数,且|a|,|b|<=106。
输出f(n)
【样例输入1】
0 1 1 1 20
【样例输入2】
0 1 -1 0 1000000000
【样例输入3】
-1 1 4 -3 18
【样例输出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 普通递归关系的更多相关文章
- Codevs 1070 普通递归关系(矩阵乘法)
1070 普通递归关系 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 考虑以下定义在非负整数n上的递归关系 f(n) = f0 ...
- codevs 3289 花匠
题目:codevs 3289 花匠 链接:http://codevs.cn/problem/3289/ 这道题有点像最长上升序列,但这里不是上升,是最长"波浪"子序列.用动态规划可 ...
- codevs 1082 线段树练习 3(区间维护)
codevs 1082 线段树练习 3 时间限制: 3 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区 ...
- codevs 1285 二叉查找树STL基本用法
C++STL库的set就是一个二叉查找树,并且支持结构体. 在写结构体式的二叉查找树时,需要在结构体里面定义操作符 < ,因为需要比较. set经常会用到迭代器,这里说明一下迭代器:可以类似的把 ...
- codevs 1576 最长上升子序列的线段树优化
题目:codevs 1576 最长严格上升子序列 链接:http://codevs.cn/problem/1576/ 优化的地方是 1到i-1 中最大的 f[j]值,并且A[j]<A[i] .根 ...
- codevs 1080 线段树点修改
先来介绍一下线段树. 线段树是一个把线段,或者说一个区间储存在二叉树中.如图所示的就是一棵线段树,它维护一个区间的和. 蓝色数字的是线段树的节点在数组中的位置,它表示的区间已经在图上标出,它的值就是这 ...
- codevs 1228 苹果树 树链剖分讲解
题目:codevs 1228 苹果树 链接:http://codevs.cn/problem/1228/ 看了这么多树链剖分的解释,几个小时后总算把树链剖分弄懂了. 树链剖分的功能:快速修改,查询树上 ...
- codevs 1082 线段树区间求和
codevs 1082 线段树练习3 链接:http://codevs.cn/problem/1082/ sumv是维护求和的线段树,addv是标记这歌节点所在区间还需要加上的值. 我的线段树写法在运 ...
- codevs 1052 地鼠游戏
1052 地鼠游戏 http://codevs.cn/problem/1052/ 题目描述 Description 王钢是一名学习成绩优异的学生,在平时的学习中,他总能利用一切时间认真高效地学习,他不 ...
随机推荐
- wcf的DataContractAttribute与DataMenmberAttribute
文章:序列化和反序列化的几种方式(DataContractSerializer)(二) 介绍了序列化控制细节.哪些字段可以序列化,序列化后这些字段的名字.
- java属性编辑器,即PropertyEditor
出处:http://www.iteye.com/topic/1123628
- Ubuntu16.04 下虚拟环境的创建与使用
1. 虚拟环境 虚拟环境(virtual environment),顾名思义是虚拟出来的环境,通俗来讲,可以借助虚拟机,docker来理解虚拟环境,就是把一部分内容独立出来,我们把这部分独立出来的 ...
- .NET项目中常用的32个正则表达式总结
最近没事总结了下最近所用到的正则表达式,下面32个是经常用到的,总结下来与大家分享. . "^-?[1-9]\\d*$",//整数 . "^[1-9]\\d*$" ...
- background的使用
先简单的介绍颜色表示法 一共有三种:单词,rgb表示法,十六进制表示法 rgb:红色 绿色 蓝色 三原色 光学显示器,每个像素都是有三原色的发光原件组成的,靠明亮度不同调成不同的颜色的 有逗号隔开,r ...
- C# Socket模拟发送接收
Socket简介 通过TCP/IP与仪器或设备通讯,在C#语言中,我们通常采用Socket.本项目是一个简单的Socket建立服务监听与Socket作为客户端请求的一个示例. 项目结构 客户端项目 S ...
- HNOI/AHOI2018题解
作为一名高二老年选手来补一下我省去年的省选题. D1T1:寻宝游戏 按顺序给出\(n\)个\(m\)位的二进制数\(a_i\),再在最前方添一个\(0\), 给出\(q\)次询问,每次询问给出一个同样 ...
- 【ActiveMQ】- 发布/订阅模式
publish/subscribe 特点:A发送的消息可以被所有监听A的对象的接收,就好比学校的广播,所有的学生都可以收听校园广播信息. 消息生产者: package com.zhiwei.advan ...
- FourAndSix: 2.01靶机入侵
0x01 前言 FourAndSix2是易受攻击的一个靶机,主要任务是通过入侵进入到目标靶机系统然后提权,并在root目录中并读取flag.tx信息 FourAndSix2.镜像下载地址: htt ...
- Linux内核分析实验六
Linux内核分析实验六 进程控制块PCB——task_struct(进程描述符) 为了管理进程,内核必须对每个进程进行清晰的描述,进程描述符提供了内核所需了解的进程信息. struct task_s ...