快速幂

来源:互联网 发布:win10允许软件联网 编辑:程序博客网 时间:2024/05/29 05:12
有时候会遇到形如求n^m得问题 ,一般是很简单的
即使用个笨办法:
ans=1;
for(int i=1; i<=n; i++)
{
    ans*=m;
}//m^n  ;
时间复杂度也不太高O(n);
但如果m很大,那么就会超时,特别慢之类的问题(我觉得一般不会,除非m大)
所以就用到了快速幂算法
根据公式
a^b=(a^2)^(b/2)其实这个公式就相当于下面这个(这里的除不是整除不是整除不是整除)
(a^n)^m=a^(mn)
不难写出代码
#include<cstdio>
#include<iostream>
int ans=1;
void quickpower(int x, int y)//ans=x^y;
{
    while(y)
    {
        if(y&1)
            ans*=x;
        x*=x;
        y>>=1;
    }
    return;
}
int main()
{
    int x, y;
    std::cin>>x>>y;//ans=x^y
    quickpower(x,y);
    std::cout<<ans;
    return 0;
}
但是其实我个人觉得吧,这个代码用处不大,因为m特大n^m肯定特特特特特大
所以要么取模要么写高精;
我觉得还是取模更好写;
所以就有
#include<cstdio>
#include<iostream>
int ans=1, k;
void quickpower(int x, int y)//ans=x^y;
{
    while(y)
    {
        if(y&1)
            ans=((ans%k)*(x%k))%k;
        x*=x;
        y>>=1;
    }
    return;
}
int main()
{
    int x, y, k;
    std::cin>>x>>y>>k;//ans=x^y%k
    quickpower(x,y);
    std::cout<<ans;
    return 0;
}//这个代码理论上应该没啥问题,有问题欢迎指出!
原创粉丝点击