1070 普通递归关系

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

数据范围及提示 Data Size & Hint

见输入描述

分类标签 Tags 点此展开

//矩阵乘法大水题
#include<cstdio>
#include<iostream>
using namespace std;
typedef double real;
typedef long long ll;
ll n;
struct matrix{real s[2][2];}A,F;
matrix operator *(const matrix &a,const matrix &b){
    matrix c;
    for(int i=0;i<2;i++){
        for(int j=0;j<2;j++){
            c.s[i][j]=0;
            for(int k=0;k<2;k++){
                c.s[i][j]+=a.s[i][k]*b.s[k][j];
            }
        }
    }
    return c;
}
matrix fpow(matrix a,ll p){
    matrix ans;
    for(int i=0;i<2;i++)for(int j=0;j<2;j++) ans.s[i][j]=(i==j);
    for(;p;p>>=1,a=a*a) if(p&1) ans=ans*a;
    return ans;
}
int main(){
    cin>>F.s[1][0]>>F.s[0][0]>>A.s[0][0]>>A.s[0][1]>>n;
    A.s[1][0]=1;
    if(F.s[1][0]==0.0&&F.s[0][0]==0.0){puts("0");return 0;}
    if(n>1) F=fpow(A,n-1)*F;
    printf("%d",(int)F.s[0][0]);
    return 0;
}
时间: 2024-10-11 05:01:45

1070 普通递归关系的相关文章

BZOJ 1070: [SCOI2007]修车(最小费用最大流)

建图很神奇..建完图其实就是裸的费用流了.. -------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<vector> #include<queue> #define rep(i,n) for(int i

hihoCoder #1070 RMQ问题再临

#1070 : RMQ问题再临 Time Limit:10000ms Case Time Limit:1000ms Memory Limit:256MB 描述 终于,小Hi和小Ho踏上了回国的旅程.在飞机上,望着采购来的特产——小Hi陷入了沉思:还记得在上上周他们去超市的时候,前前后后挑了那么多的东西,都幸运的没有任何其他人(售货员/其他顾客)来打搅他们的采购过程.但是如果发生了这样的事情,他们的采购又会变得如何呢? 于是小Hi便向小Ho提出了这个问题:假设整个货架上从左到右摆放了N种商品,并且

bzoj 1070: [SCOI2007]修车 -- 费用流

1070: [SCOI2007]修车 Time Limit: 1 Sec  Memory Limit: 128 MB Description 同一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的.现在需要安排这M位技术人员所维修的车及顺序,使得顾客平均等待的时间最小. 说明:顾客的等待时间是指从他把车送至维修中心到维修完毕所用的时间. Input 第一行有两个m,n,表示技术人员数与顾客数. 接下来n行,每行m个整数.第

1065 - Number Sequence &amp;&amp;1070 - Algebraic Problem

1065 - Number Sequence   PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 32 MB Let's define another number sequence, given by the following function: f(0) = a f(1) = b f(n) = f(n-1) + f(n-2), n > 1 When a = 0 and b = 1, this sequ

LightOJ 1070 Algebraic Problem (推导+矩阵快速幂)

题目链接:LightOJ 1070 Algebraic Problem 题意:已知a+b和ab的值求a^n+b^n.结果模2^64. 思路: 1.找递推式 得到递推式之后就是矩阵快速幂了 注意:模2^64,定义成unsigned long long 类型,因为无符号类型超过最大范围的数与该数%最大范围 的效果是一样的. AC代码: #include<stdio.h> #include<string.h> #define LL unsigned long long struct Ma

九度OJ 1070 今年的第几天?(模拟)

题目1070:今年的第几天? 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:3491 解决:1936 题目描述: 输入年.月.日,计算该天是本年的第几天. 输入: 包括三个整数年(1<=Y<=3000).月(1<=M<=12).日(1<=D<=31). 输出: 输入可能有多组测试数据,对于每一组测试数据, 输出一个整数,代表Input中的年.月.日对应本年的第几天. 样例输入: 1990 9 20 2000 5 1 样例输出: 263 122 #includ

PAT 1070. Mooncake (25)

Mooncake is a Chinese bakery product traditionally eaten during the Mid-Autumn Festival.  Many types of fillings and crusts can be found in traditional mooncakes according to the region's culture.  Now given the inventory amounts and the prices of al

PAT 乙级 1070 结绳(25) C++版

1070. 结绳(25) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 给定一段一段的绳子,你需要把它们串成一条绳.每次串连的时候,是把两段绳子对折,再如下图所示套接在一起.这样得到的绳子又被当成是另一段绳子,可以再次对折去跟另一段绳子串连.每次串连后,原来两段绳子的长度就会减半. 给定N段绳子的长度,你需要找出它们能串成的绳子的最大长度. 输入格式: 每个输入包含1个测试用例.每个测试用例第1行给出正整数N

1070. 结绳(25)

1070. 结绳(25) 给定一段一段的绳子,你需要把它们串成一条绳.每次串连的时候,是把两段绳子对折,再如下图所示套接在一起.这样得到的绳子又被当成是另一段绳子,可以再次对折去跟另一段绳子串连.每次串连后,原来两段绳子的长度就会减半. 给定N段绳子的长度,你需要找出它们能串成的绳子的最大长度. 输入格式: 每个输入包含1个测试用例.每个测试用例第1行给出正整数N (2 <= N <= 104):第2行给出N个正整数,即原始绳段的长度,数字间以空格分隔.所有整数都不超过104. 输出格式: 在