http://acm.hdu.edu.cn/showproblem.php?pid=1568
与 HDU 1060 Leftmost Digit 差不多
求后几位的话,可以构造矩阵相乘,二分求冪
求前几位,不需要,直接运用数学公式和对数的性质来求
斐波那契数列通项公式
![](http://acm.hdu.edu.cn/forum/attachment/9_17558_66eb0d62d0d7087.jpg)
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
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }