hdu1568Fibonacci(公式变形)
来源:互联网 发布:算法统宗 pdf 下载 编辑:程序博客网 时间:2024/04/27 19:55
->题目请戳这里<-
题目大意:中文题,略。
题目分析:要求10^9内任意菲波数的高4位,把每个菲波数求出来是不可能的,所以考虑从公式入手。
斐波那契数列公式:fn = 1/√5 [ ((1 + √5)/2)^n - ((1 - √5)/2)^n].公式并不复杂,但是如果直接代进去算的话由于n会非常大,所以会TLE,必须对公式处理一下。
因为指数n会特别大,所以要对公式降阶处理:公式两边同时以10为底取对数:
log10(fn) = log10(1/√5) + log10[((1 + √5)/2)^n - ((1 - √5)/2)^n]
= log10(1/√5) + log10[((1 + √5)/2)^n * (1 + ((1 - √5)/(1 + √5))^n] (因为(1 - √5) / 2 是个负数,所以不能直接将上面的式子分解,处理一下)
= log10(1/√5) + n * log10[(1 + √5)/2] + log10[1 + ((1 + √5)/(1 - √5))^n]
考虑到最后一项:log10[1 + ((1 + √5)/(1 - √5))^n] = log10[1 + ((√5 - 3)/2)^n],期中(√5 - 3)/2 ≈ -0.2,再n次方后更小,所以此项趋近于0,对结果影响较小,可以忽略(为什么,想一想)。
接下来我们看答案:fn = 10^(log10(fn)),经过一处理,发现这里的指数部分还是很大,设指数部分为t,显然这个t是个浮点数,将t分成2部分:t = t0 + t1;t0代表t的整数部分,t1代表t的小数部分。fn = 10^t0 * 10 ^ t1,10^t0表示1后面跟t0个0,对fn的各位数字并无影响,而决定fn各位数数字的就是t1!所以我们只需要求出10^t1即可!这个运算量还是可以接受的,由于处理过程中我们当n比较大的时候忽略了第三项,所以当n很小的时候计算出来的结果会有误差,所以我们解决的方案是——打表!!!
详情请见代码:
#include <iostream>#include<cmath>#include<cstdio>using namespace std;int n;double ans1;//fibonacci公式:fn = 1/sqrt(5) * [(1 + sqrt(5))^n - (1 - sqrt(5))^n];int fibo[21] = {0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181,6765};//打表输出所有的5位数以内的斐波数,至少21个,少了会WA,因为精度会有损失!int main(){ //printf("%d\n",(int)pow(10,3.123)); //printf("%d\n",(int)pow(10,3.12)); //printf("%d\n",(int)pow(10,3.1)); //printf("%lf\n",pow(10,0.123)); while(scanf("%d",&n) != EOF) { if(n < 21) { printf("%d\n",fibo[n]); continue; } ans1 = log10(1.0 / sqrt(5.0)) + log10((1.0 + sqrt(5.0)) / 2.0) * n; ans1 = ans1 - (int)ans1; ans1 = pow(10.0,ans1); //printf("%lf\n",ans1); while(ans1 < 1000) ans1 = ans1 * 10; int ans = (int)ans1; printf("%d\n",ans); } return 0;}//15MS340K
- hdu1568Fibonacci(公式变形)
- hdu1568Fibonacci
- HDU1799-组合公式变形
- 费波拉契通项公式变形
- 用摄动法证明fibs的一个公式(变形)
- UVA - 11029 - Leading and Trailing (快速幂+公式变形)
- An easy problem 2601 (数学题+公式变形)
- HDU 1719 Friend (思路题)公式推导变形
- 用摄动法证明fibs的一个公式(继续变形)
- UVA1452|LA4727-----Jump------经典的约瑟夫公式的变形(DP)
- ZOJ 3424 Rescue(和式变形递推公式降低复杂度)
- 数论 --- 斐波纳挈数列公式的变形
- uva 10655 公式变形 矩阵快速幂
- 【洛谷】2759 奇怪的函数 公式变形
- 由欧拉公式变形而获得的等式
- 特殊的变形组合公式求和的推导
- hdu 5175 Misaki's Kiss again (抑或运算+公式变形)
- HDU 1299 Diophantus of Alexandria (公式变形 分解质因数)
- 杭电1492
- 黑马程序员-java i/o
- 算法导论 2.3-3
- V4l2 Capture Sequence 捕获过程
- Semplice Linux 3.0.0 发布
- hdu1568Fibonacci(公式变形)
- 3.自增自减操作符前缀形式与后缀形式的区别
- 设计模式之外观模式
- KDD Cup竞赛介绍
- [reportlab教程](3) – 中文的处理
- Python多线程的创建,相关函数和守护线程的理解
- /var/log/secure
- POJ 1804 Brainman
- 拓扑排序模板