十进制快速幂

例题(NOI送分题):

求Fi数列的第n项

n<=10的一百万次方


首先,这题很明显是矩阵快速幂,之前的POJ的一个博客里也提到过Fi的第i项,不过n的范围很小,直接用二进制快速幂就可以解决,但是这道题中二进制是肯定解决不了的,所以需要用到十进制快速幂。

一开始做这道题可能很难想到用到十进制快速幂,但是如果对二进制快速幂有十分深刻的理解的话,还是可以写出来的。

我们已知二进制快速幂是通过把幂看作二进制数来处理的,所以我们更可以把幂数当做十进制数处理(废话)。

只需把二进制快速幂简单地改几个数就可以了,先上二进制的:

int pow(int a,int b)
{
    int ans=1;
    while(b)
    {
        if(b&1)
        ans*=a;
        a*=a;
        b>>=1
    }
    return ans;
}

然后是十进制的:

int pow(int a,int b)
{
    int ans=1;
    while(b)
    {
        int p=b%10,l=a;
        if(p)
        for(int i=1;i<=p;i++)
        ans*=a;
        for(int i=1;i<=10;i++)
        a*=l;//可优化
        b/=10;
    }
    return ans;
}

当然还要取摸的,自己加吧。

当然十进制快速幂在平时还是比二进制的慢很多的,同时你还可以在代码中用二进制快速幂优化。

PEACE
原文地址:https://www.cnblogs.com/gshdyjz/p/7191803.html