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 王钢是一名学习成绩优异的学生,在平时的学习中,他总能利用一切时间认真高效地学习,他不 ...
随机推荐
- 团队作业7——第二次项目冲刺(Beta版本12.07——12.08)
1.当天站立式会议照片 本次会议在5号公寓3楼召开,本次会议内容:①:熟悉每个人想做的模块.②:根据项目要求还没做的完成. 2.每个人的工作 经过会议讨论后确定了每个人的分工 组员 任务 陈福鹏 实现 ...
- 福大软工 · 第七次作业 - 需求分析报告(404 Note Found队)
目录 组队后的团队项目的整体计划安排 项目logo及思维导图 项目logo 思维导图 产品思维导图 产品思维导图-引导 产品思维导图-后端数据处理.存储 产品思维导图-短信识别 产品思维导图-智能分析 ...
- PAT 甲级 1113 Integer Set Partition
https://pintia.cn/problem-sets/994805342720868352/problems/994805357258326016 Given a set of N (> ...
- 深入探索.NET内部了解CLR如何创建运行时对象
前言 SystemDomain, SharedDomain, and DefaultDomain. 对象布局和内存细节. 方法表布局. 方法分派(Method dispatching). 因为公共语言 ...
- 过滤器将获取到的内容注入到servlet的request中
过滤器将获取到的内容注入到servlet的request中
- 关于nginx的一点记录
(1) 安装nginx官网下载:http://nginx.org下载适合Windows的安装包,是一个压缩包,直接解压就可以了. (2) 启动nginx有三种方式启动:a. 双击nginx.exe图标 ...
- mybatis中@Param的使用
@Param:当映射器方法需要多个参数时,这个注解可以被用于:给映射器方法中的每个参数来取一个名字.否则,多参数将会以它们的顺序位置和SQL语句中的表达式进行映射,这是默认的. 语法要求:若使用 ...
- BZOJ5102 POI2018Prawnicy(堆)
考虑固定右端点,使左端点最小.那么按右端点排序后查询前缀这些区间的左端点第k小即可.然而写了一个treap一个线段树都T飞了,感觉惨爆.事实上可以用堆求第k小,维护一个大根堆保证堆中元素不超过k个即可 ...
- 01 Spring Boot 的简单配置和使用
Spring Boot 简介 使用 Spring Boot 可以让我们快速创建一个基于 Spring 的项目,而让这个 Spring 项目跑起来我们只需要很少的配置就可以了. 创建 Spring Bo ...
- 利用Eric+Qt Designer编写倒计时时钟
[前言]前几日通过编写命令行通讯录,掌握了Python的基本语法结构,于是开始向更高水平冲击,利用Eric与Qt Designer 编写一个带界面的小程序.本次实操中也确实遇到了不少问题,通过学习也都 ...