hdu1568&&hdu3117 求斐波那契数前四位和后四位
题目链接: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 求斐波那契数前四位和后四位的更多相关文章
- 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 …… ...
- POJ 3070(求斐波那契数 矩阵快速幂)
题意就是求第 n 个斐波那契数. 由于时间和内存限制,显然不能直接暴力解或者打表,想到用矩阵快速幂的做法. 代码如下: #include <cstdio> using namespace ...
- HDU 1568 Fibonacci【求斐波那契数的前4位/递推式】
Fibonacci Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Proble ...
- 求斐波那契数的python语言实现---递归和迭代
迭代实现如下: def fab(n): n1 = 1 n2 = 1 if n<1: print("输入有误!") return -1 while (n-2)>0: n3 ...
- 数学算法(一):快速求斐波那契数第n项通过黄金分割率公式
有一个固定的数学公式= =,不知道的话显然没法应用 首先黄金分割率接近于这个公式, (以下为黄金分割率与斐波那契的关系,可跳过) 通过斐波那契数列公式 两边同时除以 得: (1) 注意后一项比前一项接 ...
- Python - 求斐波那契数列前N项之和
n = int(input("Input N: ")) a = 0 b = 1 sum = 0 for i in range(n): sum += a a, b = b, a + ...
- 算法笔记_001:斐波那契数的多种解法(Java)
本篇文章解决的问题来源于算法设计与分析课程的课堂作业,主要是运用多种方法来计算斐波那契数.具体问题及解法如下: 一.问题1: 问题描述:利用迭代算法寻找不超过编程环境能够支持的最大整数的斐波那契数是第 ...
- codeforce 227E 矩阵快速幂求斐波那契+N个连续数求最大公约数+斐波那契数列的性质
E. Anniversary time limit per test2 seconds memory limit per test256 megabytes inputstandard input o ...
- 用x种方式求第n项斐波那契数,99%的人只会第一种
大家好啊,我们又见面了.听说有人想学数据结构与算法却不知道从何下手?那你就认真看完本篇文章,或许能从中找到方法与技巧. 本期我们就从斐波那契数列的几种解法入手,感受算法的强大与奥妙吧. 原文链 ...
随机推荐
- IP网络,光网络以及轨道交通的快速卸载随想
凌晨3点钟,半夜睡眼朦胧.忽然听到左右两耳嗡嗡,身下的榻榻米垫沙沙作响,以为在梦境,然而睁眼清醒过来.发现并没有看见什么,依旧在黑夜,于是确认这不是在在梦.于是开灯,发现一仅仅蟑螂趴在垫子上.两仅仅蚊 ...
- mem_fun与mem_fun_ref的区别
一句话:container<ClassType*>就用mem_fun,container<ClassType>就用mem_fun_ref 参考: http://www.cplu ...
- python课文题目格式
import win32com from win32com.client import Dispatch,constants w = win32com.client.Dispatch('Word.Ap ...
- OpenERP Framework API存档
一. openerp.Widget 方法列表 init:function(parent) destroy:function() appendTo:function(target) prependTo: ...
- 如何测试是否安装了web服务器
windows默认没有安装web服务器,我们可以安装IIS. 我们安装个tomacte服务器,开发web程序必须的!!如果测试后出现这个页面说明安装成功le ! 我们这个安装的是本地服务器,可以把we ...
- jquery filter和not
jQuery filter() 方法 filter() 方法允许您规定一个标准.不匹配这个标准的元素会被从集合中删除,匹配的元素会被返回. 下面的例子返回带有类名 "intro" ...
- 《高性能MySQL》读书笔记(1)
慢查询 当一个资源变得效率低下的时候,应该了解一下为什么会这样.有如下可能原因:1.资源被过度使用,余量已经不足以正常工作.2.资源没有被正确配置3.资源已经损坏或者失灵 因为慢查询,太多查询的实践过 ...
- rsync+inotify-tools
源服务器:192.168.0.100 目标服务器:192.168.0.101 目的:把源服务器上/home/test目录实时同步到目标服务器的/home/test下 具体操作: 第一部 ...
- 虚拟化–操作系统级 LXC Linux Containers内核轻量级虚拟化技术
友情提示:非原文链接可能会影响您的阅读体验,欢迎查看原文.(http://blog.geekcome.com) 原文地址:http://blog.geekcome.com/archives/288 软 ...
- mysql 分区 限制
MySQL分区的限制 • 只能对数据表的整型列进行分区源码天空,或者数据列可以通过分区函数转化成整型列 • 最大分区数目不能超过1024 • 如果含有唯一索引或者主键,则分区列必须包含在所 ...