十进制快速幂


例题(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;
}

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

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


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM