hdu 1568 Fibonacci (数论)
来源:互联网 发布:linux挂载windows盘 编辑:程序博客网 时间:2024/05/18 00:26
Fibonacci
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3654 Accepted Submission(s): 1671
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决定要考考他,于是每问他一个数字,他就要把答案说出来,不过有的数字太长了。所以规定超过4位的只要说出前4位就可以了,可是CodeStar自己又记不住。于是他决定编写一个程序来测验zouyu说的是否正确。
(f[0]=0,f[1]=1;f[i] = f[i-1]+f[i-2](i>=2))的值全部给背了下来。
接下来,CodeStar决定要考考他,于是每问他一个数字,他就要把答案说出来,不过有的数字太长了。所以规定超过4位的只要说出前4位就可以了,可是CodeStar自己又记不住。于是他决定编写一个程序来测验zouyu说的是否正确。
Input
输入若干数字n(0 <= n <= 100000000),每个数字一行。读到文件尾。
Output
输出f[n]的前4个数字(若不足4个数字,就全部输出)。
Sample Input
012345353637383940
Sample Output
011235922714932415390863241023
解析:数论题,智商不够,就把网上大神的整理的思路简述一下。
用到了斐波那契数列的通项公式。
先看对数的性质,loga(b^c)=c*loga(b),loga(b*c)=loga(b)+loga(c);
假设给出一个数10234432,那么log10(10234432)=log10(1.0234432*10^7)=log10(1.0234432)+7;
log10(1.0234432)就是log10(10234432)的小数部分.
log10(1.0234432)=0.010063744
10^0.010063744=1.023443198
那么要取几位就很明显了吧~
先取对数(对10取),然后得到结果的小数部分bit,pow(10.0,bit)以后如果答案还是<1000那么就一直乘10。
注意偶先处理了0~20项是为了方便处理~
这题要利用到数列的公式:an=(1/√5) * [((1+√5)/2)^n-((1-√5)/2)^n](n=1,2,3.....)
取完对数
log10(an)=-0.5*log10(5.0)+((double)n)*log(f)/log(10.0)+log10(1-((1-√5)/(1+√5))^n)其中f=(sqrt(5.0)+1.0)/2.0;
log10(1-((1-√5)/(1+√5))^n)->0
所以可以写成log10(an)=-0.5*log10(5.0)+((double)n)*log(f)/log(10.0);
最后取其小数部分。
AC代码:
#include<iostream>#include<cstdio>#include<cmath>#include<algorithm>using namespace std;int f[21] = {0, 1, 1};int main(){// freopen("in.txt", "r", stdin);int n;for(int i = 2; i < 21; ++i)f[i] = f[i - 1] + f[i - 2];while(scanf("%d", &n) != EOF){if(n <= 20){printf("%d\n", f[n]);continue;}else{double temp = -0.5 * log(5.0) / log(10.0) + ((double)n) * log((sqrt(5.0)+1.0)/2.0) / log(10.0);temp -= floor(temp);temp = pow(10.0, temp);while(temp < 1000)temp *= 10;printf("%d\n", (int)temp);}}return 0;}
呜呜呜~~~数论题,真是数学不好,硬伤啊。。。
0 0
- hdu 1568 Fibonacci (数论)
- HDU 1568 Fibonacci 数论
- 数论(fabonacci数列) hdu-1568-Fibonacci
- HDU 1568 Fibonacci(简单数论)
- hdu 1021 Fibonacci Again(简单数论)
- HDU 1021 Fibonacci Again(数论)
- HDU 3117 Fibonacci Numbers 数论
- HDU 1021 Fibonacci Again(数论简单题)
- HDU 1568 Fibonacci (数学)
- UVa 10229 - Modular Fibonacci(数论,规律)
- [BZOJ2813]奇妙的Fibonacci(数论)
- HDU 1568 Fibonacci
- HDU 1568 Fibonacci
- Fibonacci Hdu 1568
- HDU 1568 - Fibonacci
- HDU-1568 Fibonacci
- HDU 1568 Fibonacci
- HDU 1568 Fibonacci
- 高级指针的运算
- 36-UITableView —QQ聊天实例
- 随机生成1024个数,存入一段内存,用指针实现获取1024个数的最大数地址,最小数地址
- java学习--IO流(4)
- 实现一个计算器
- hdu 1568 Fibonacci (数论)
- request表示路径
- gdb调试的若干项
- atan(正切函数)
- 有两个指针pa,pb分别指向有两个数,a,b,请写一个函数交换两个指针的指向,也就是让pa指向b,让pb指向a
- LeetCode String to Integer (atoi)
- 37-给UIImage,NSString添加扩展方法(根据内容拉伸图片,根据内容计算文本大小)
- 九度OJ 1056 最大公约数
- 开辟一个二维数组,有10*8个元素,用随机数填充,按照下面的方法用函数实现查找一个数是否存在