Qiuqiqiu  
不管道路多么崎岖坎坷,我永远不停下追逐梦想的脚步!

http://acm.hdu.edu.cn/showproblem.php?pid=1568

与 HDU 1060 Leftmost Digit 差不多

求后几位的话,可以构造矩阵相乘,二分求冪

求前几位,不需要,直接运用数学公式和对数的性质来求

斐波那契数列通项公式

an=(1/√5)* [((1+√5)/2)^n-((1-√5)/2)^n]

求x^y的前几位
高斯函数x=[x]+{x},[x]为x的整数部分,{x}为x的小数部分
运用对数性质,t=x^y=a*10^n(科学计数法)
lgt=y*lgx=lga+n (n=[lgt],lga={lgt},因为1<=a<10,所以0<=lga<1)
a=10^{lgt}
e=y*lgx, e=e-[e], a=10^e

代码
 1 #include <stdio.h>
2 #include <math.h>
3 int main()
4 {
5 const int N=21;
6 int f[N]={0,1};
7 for (int i=2;i<N;i++) f[i]=f[i-1]+f[i-2];
8 int n;
9 while (scanf("%d",&n)!=EOF)
10 {
11 if (n<N)
12 {
13 printf("%d\n",f[n]);
14 continue;
15 }
16 double e,a;
17 e=log10(1/sqrt(5))+n*log10((1+sqrt(5))/2);
18 a=pow(10.0,e-floor(e));
19 printf("%d\n",(int)(a*1000));
20 }
21 }

 

posted on 2011-11-28 20:31  Qiuqiqiu  阅读(258)  评论(0编辑  收藏  举报