题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1568

题意:如标题所示,求斐波那契数前四位,不足四位直接输出答案

斐波那契数列通式:

当n<=20的时候,不足四位,所以直接打表。

当n>20的时候,大于四位的时候,ans满足这个公式:ans=-0.5*log10(5.0)+num*1.0*log10((1+sqrt(5.0))/2.0);

这个公式是怎么来的呢?我们可以对an取10的对数,根据对数的性质。

log10(ans)=log10(1/sqrt(5))+log10(((1+sqrt(5))/2)^num-((1-sqrt(5))/2)^num))

log10(ans)=0-0.5*log10(5.0)+log10(((1+sqrt(5))/2)^num-((1-sqrt(5))/2)^num)),当num趋于无穷的的时候  。

lim((1-sqrt(5))/2)^num)=0

log10(ans)=0-0.5*log10(5.0)+log10(((1+sqrt(5))/2)^num)= -0.5*log10(5.0)+num*1.0*log10( (1+sqrt(5))/2),我们就得到了上文的公式。

这里说一下原理,x=123456789,那么y=log10(x)=1.23456789,这个时候将y*=1000,就得到了 y=1234.56789,求幂次和取对数互为逆运算,通过这个原理我们可以求前x的长度。

//Author: xiaowuga
#include <bits/stdc++.h>
#define maxx INT_MAX
#define minn INT_MIN
#define inf 0x3f3f3f3f
#define maxn
using namespace std;
typedef long long ll;
ll table[];
int main() {
ios::sync_with_stdio(false);cin.tie();
table[]=;table[]=;
for(int i=;i<=;i++) table[i]=table[i-]+table[i-];
ll num;
while(cin>>num){
if(num<=) cout<<table[num]<<endl;
else{
double ans=-0.5*log10(5.0)+num*1.0*log10((+sqrt(5.0))/2.0);
ans=ans-(ll)ans;
double a=pow(10.0,ans);
a=*a;
cout<<(ll)a<<endl;
}
}
return ;
}

hdu3117:Fibonacci Numbers

这道题求斐波那契的数列的前四位和后四位,前四位和1568是一样的,后四位只需要把mod变成10000就行了,比较简单,直接看代码吧!!

//Author: xiaowuga
#include <bits/stdc++.h>
#define maxx INT_MAX
#define minn INT_MIN
#define inf 0x3f3f3f3f
#define n 2
#define MOD 10000
using namespace std;
typedef long long ll;
ll table[];
ll first_four(ll num){
double ans=-0.5*log10(5.0)+num*1.0*log10((+sqrt(5.0))/2.0);
ans=ans-(ll)ans;
double a=pow(10.0,ans);
a=*a;
return (ll)a;
}
struct Matrix{
ll mat[][];
Matrix operator * (const Matrix & m) const{
Matrix tmp;
for(int i=;i<n;i++)
for(int j=;j<n;j++){
tmp.mat[i][j]=;
for(int k=;k<n;k++){
tmp.mat[i][j]+=mat[i][k]*m.mat[k][j]%MOD;
tmp.mat[i][j]%=MOD;
}
}
return tmp;
}
};
Matrix POW(Matrix &m,ll k){
Matrix ans;
memset(ans.mat,,sizeof(ans.mat));
for(int i=;i<n;i++) ans.mat[i][i]=;
while(k){
if(k&) ans=ans*m;
k/=;
m=m*m;
}
return ans;
}
int main() {
ios::sync_with_stdio(false);cin.tie();
table[]=;table[]=;
for(int i=;i<=;i++) table[i]=table[i-]+table[i-];
ll num;
while(cin>>num){
if(num<=) cout<<table[num]<<endl;
else{
cout<<first_four(num)<<"...";
Matrix m;
memset(m.mat,,sizeof(m.mat));
m.mat[][]=m.mat[][]=m.mat[][]=;m.mat[][]=;
Matrix ans=POW(m,num-);
cout.fill('');
cout.width();
cout<<ans.mat[][]%MOD<<endl;
}
}
return ;
}

hdu1568&&hdu3117 求斐波那契数前四位和后四位的更多相关文章

  1. C++求斐波那契数

    题目内容:斐波那契数定义为:f(0)=0,f(1)=1,f(n)=f(n-1)+f(n-2)(n>1且n为整数) 如果写出菲氏数列,则应该是: 0 1 1 2 3 5 8 13 21 34 …… ...

  2. POJ 3070(求斐波那契数 矩阵快速幂)

    题意就是求第 n 个斐波那契数. 由于时间和内存限制,显然不能直接暴力解或者打表,想到用矩阵快速幂的做法. 代码如下: #include <cstdio> using namespace ...

  3. HDU 1568 Fibonacci【求斐波那契数的前4位/递推式】

    Fibonacci Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Proble ...

  4. 求斐波那契数的python语言实现---递归和迭代

    迭代实现如下: def fab(n): n1 = 1 n2 = 1 if n<1: print("输入有误!") return -1 while (n-2)>0: n3 ...

  5. 数学算法(一):快速求斐波那契数第n项通过黄金分割率公式

    有一个固定的数学公式= =,不知道的话显然没法应用 首先黄金分割率接近于这个公式, (以下为黄金分割率与斐波那契的关系,可跳过) 通过斐波那契数列公式 两边同时除以 得: (1) 注意后一项比前一项接 ...

  6. Python - 求斐波那契数列前N项之和

    n = int(input("Input N: ")) a = 0 b = 1 sum = 0 for i in range(n): sum += a a, b = b, a + ...

  7. 算法笔记_001:斐波那契数的多种解法(Java)

    本篇文章解决的问题来源于算法设计与分析课程的课堂作业,主要是运用多种方法来计算斐波那契数.具体问题及解法如下: 一.问题1: 问题描述:利用迭代算法寻找不超过编程环境能够支持的最大整数的斐波那契数是第 ...

  8. codeforce 227E 矩阵快速幂求斐波那契+N个连续数求最大公约数+斐波那契数列的性质

    E. Anniversary time limit per test2 seconds memory limit per test256 megabytes inputstandard input o ...

  9. 用x种方式求第n项斐波那契数,99%的人只会第一种

    大家好啊,我们又见面了.听说有人想学数据结构与算法却不知道从何下手?那你就认真看完本篇文章,或许能从中找到方法与技巧.     本期我们就从斐波那契数列的几种解法入手,感受算法的强大与奥妙吧. 原文链 ...

随机推荐

  1. Decoration4:分页展示

    现在我们实现前台List的分页展示,这也是最基本的要求 先看现在的Rest数据格式,在spring的默认返回中,分页用到的元素都已经在page节点中返回了,只要在前台合理利用就足够了 { " ...

  2. 第7章 Iptables与Firewalld防火墙。

    第7章 Iptables与Firewalld防火墙.     Chapter7_听较强节奏的音乐能够让您更长时间的投入在学习中. <Linux就该这么学> 00:00/00:00     ...

  3. apache官方中文hadoop说明文档地址

    http://hadoop.apache.org/docs/r1.0.4/cn/quickstart.html

  4. AIX中查找端口号和进程

    1.由端口号查找进程 维护系统或检查到不明的端口自然要去查一下这个端口是由哪个进程来监听的windows可以用命令netstat -ano来查端口对应的进程的pid. aix却并不能,aix需要使用下 ...

  5. spring中事务传播解读:PROPAGATION_REQUIRES_NEW

    第一步:获取事务状态,判断当前事务线程是否存在.第二步:如果当前事务的传播行为为PROPAGATION_REQUIRES_NEW,挂起当前线程绑定的事务,取消当前事务的sessionHolder和co ...

  6. Bootstrap学习笔记(5)--实现Bootstrap导航条可点击和鼠标悬停显示下拉菜单

    实现Bootstrap导航条可点击和鼠标悬停显示下拉菜单 微笑的鱼 2014-01-03 Bootstrap 5,281 次围观 11条评论 使用Bootstrap导航条组件时,如果你的导航条带有下拉 ...

  7. 数字集成电路设计-14-DPI

    引言 在进行IC验证时,尤其是规模较大的时候,单纯用Verilog和SV来构建testbench.可能会稍显吃力. 在这样的情况下,使用C或者C++等软件语言往往会大大加快验证速度,提高验证效率. P ...

  8. Unix系统编程()malloc和free的实现

    尽管malloc和free所提供的内存分配接口比之brk和sbrk要容易许多,但在使用时仍然容易犯下各种编程错误. 理解malloc和free的实现,将使我们洞悉产生这些错误的原因以及如何才能避免此类 ...

  9. thinkphp 命名规范

    目录和文件命名 目录和文件名采用 小写+下划线,并且以小写字母开头: 类库.函数文件统一以.php为后缀: 类的文件名均以命名空间定义,并且命名空间的路径和类库文件所在路径一致(包括大小写): 类名和 ...

  10. jq 按回车键 登陆

    $("body").keydown(function(e) {             if (event.which == "13") {//keyCode= ...