【TOJ 3600】Fibonacci II (对数+斐波那契通项式)

描述

2007年到来了。经过2006年一年的修炼,数学神童zouyu终于把0到100000000的Fibonacci数列
(f[0]=0,f[1]=1;f[i] = f[i-1]+f[i-2](i>=2))的值全部给背了下来。
接下来,CodeStar决定要考考他,于是每问他一个数字,他就要把答案说出来,不过有的数字太长了。所以规定超过4位的只要说出前4位就可以了,可是CodeStar自己又记不住。于是他决定编写一个程序来测验zouyu说的是否正确。

输入

输入若干数字n(0 <= n <= 100000000),每个数字一行。读到文件尾。

输出

输出f[n]的前4个数字(若不足4个数字,就全部输出)。

样例输入

0
1
2
3
4
5
35
36
37
38
39
40

样例输出

0
1
1
2
3
5
9227
1493
2415
3908
6324
1023

题解:

假设给出一个数10234432,那么log10(10234432)=log10(1.0234432*10^7)=log10(1.0234432)+7。
log10(1.0234432)=0.010063744 即是 log10(10234432)的小数部分。
那么 10^0.010063744=1.023443198,取前4位1023即是答案!

为了方便计算,在此我预处理了前17个斐波那契数。

此题在运用对数的同时,还需要斐波那契数列的通项公式:

对该公式取10的对数

又由于 log10(1-((1-√5)/(1+√5))^n)在n无限增大时的极限为0,所以我们在写公式的时候可以省去这一项。

#include<bits/stdc++.h>
using namespace std;
int fib[20];
int main()
{
    int i,j,k,n;
    fib[0]=0;
    fib[1]=1;
    for(i=2;i<=17;i++)
        fib[i]=fib[i-1]+fib[i-2];
    double t=(1.0+sqrt(5))*0.5,ans;
    while(scanf("%d",&n)!=EOF)
    {
        if(n<=17)
            printf("%d\n",fib[n]);
        else
        {
            ans=-0.5*log10(5.0)+n*1.0*log10(t);
            ans=ans-floor(ans);
            ans=pow(10.0,ans);
            while(ans<1000)
                ans*=10;
            printf("%d\n",int(ans));
        }
    }
    return 0;
} 

原文地址:https://www.cnblogs.com/kannyi/p/9846459.html

时间: 2024-11-14 00:02:26

【TOJ 3600】Fibonacci II (对数+斐波那契通项式)的相关文章

HDU 3117 Fibonacci Numbers(斐波那契前后四位,打表+取对+矩阵快速幂)

HDU 3117 Fibonacci Numbers(斐波那契前后四位,打表+取对+矩阵快速幂) ACM 题目地址:HDU 3117 Fibonacci Numbers 题意: 求第n个斐波那契数的前四位和后四位. 不足8位直接输出. 分析: 前四位有另外一题HDU 1568,用取对的方法来做的. 后四位可以用矩阵快速幂,MOD设成10000就行了. 代码: /* * Author: illuz <iilluzen[at]gmail.com> * Blog: http://blog.csdn.

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

Fibonacci Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Description 2007年到来了.经过2006年一年的修炼,数学神童zouyu终于把0到100000000的Fibonacci数列 (f[0]=0,f[1]=1;f[i] = f[i-1]+f[i-2](i>=2))的值全部给背了下来. 接下来,CodeStar决定要考考他,于是每问他一

HDU 1708 Fibonacci String(斐波那契字串)

Fibonacci String Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 5358    Accepted Submission(s): 1819 Problem Description After little Jim learned Fibonacci Number in the class , he was very in

UVA 11582 Colossal Fibonacci Numbers! 大斐波那契数

大致题意:输入两个非负整数a,b和正整数n.计算f(a^b)%n.其中f[0]=f[1]=1, f[i+2]=f[i+1]+f[i]. 即计算大斐波那契数再取模. 一开始看到大斐波那契数,就想到了矩阵快速幂,输出等了几秒钟才输出完,肯定会超时.因为所有计算都是要取模的,设F[i]=f[i] mod n.F[0]=F[1]=1.只要出现F[i]=F[i+1]=1,那么整个序列就会重复.例如n=3,则序列为1,1,2,0,2,2,1,0,1,1……第九项和第十项都等于1,所以之后的序列都会重复. 至

Fibonacci(指斐波那契)

#include<stdio.h>void main(){ int f1=1,f2=1,f3; int i; printf("%d %d ",f1,f2); for(i=1;i<=7;i++) {f3=f1+f2; printf("%d ",f3); f1=f2; f2=f3; } return ;}/*f1=1;f2=1;f(n)=f(n-1)+f(n-2);*/

c语言:写一个函数,输入n,求斐波拉契数列的第n项(5种方法,层层优化)

写一个函数,输入n,求斐波拉契数列的第n项. 斐波拉契数列:1,1,2,3,5,8...,当n大于等于3时,后一项为前面两项之和. 解:方法1:从斐波拉契数列的函数定义角度编程 #include<stdio.h> int fibonacci(int n) { int num1=1, num2=1, num3=0,i; if (n <= 2) { printf("斐波拉契数列的第%d项为:%d\n",n,num1); } else { for (i = 2; i <

Talking About斐波那契数列(三种实现方法)

一直学习数据结构和算法,虽然学的没有太好,但还是觉得应该做一些有意思的程序来实现以下~牛客网(大哥推荐,还有就是..不要问我大哥是谁~~)有剑指Offer系列很多的题目,不管是大神还是..应该去做一下,感受编程的魅力~~(首先承认自己还是有很多不足的地方,但尽量去完善每一行代码~)  废话少说,代码搞起~ import java.util.Scanner; /** * 现在要求输入一个整数n,请你输出斐波那契数列的第n项. * 斐波那契数列,又称黄金分割数列,指的是这样一个数列 0, 1, 1,

斐波那契数列-兔子问题

/************************************************************************************************  题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,*  小兔子长到第三后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? *  1.程序分析: 兔子(对)的规律为数列1,1,2,3,5,8,13,21....* @param args* [斐波那契数列]*********

看数据结构写代码(53) 静态查找表(线性查找,二分查找,斐波那契查找,插值查找)

查找定义:根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素(或记录). 查找表分类:静态查找表和动态查找表. 静态查找表:只查找,而不进行插入,删除. 动态查找表:在查找过程中同时插入查找表中不存在的数据元素,或者从查找表中删除已经存在的某个数据元素. 静态表的 查找 大致 四种 算法: 线性查找,二分查找,斐波那契查找和插值查找. 其中 在线性查找之前,对表 无要求.对于 其余三种 需要 在查找之前 排序.插值查找 除了 需要 排序,还需要 均匀分布. 下面 给出代码: 线性查