您的位置:首页 > 其它

LG 的数学计划 ---- 第四步 快速幂

2016-09-06 19:52 127 查看
快速幂是解决什么问题的怎么一种神奇的东西呢?

考虑这样一个问题,给出b和k,求出b^k的值,由于结果可能很大,再给出p,只要输出对p取模后的答案就好了。

那么,首先讲讲简单的暴力求法:

int query(int b,int k,int p){
int rec=1,i;
for(i=1;i<=k;i++){
rec*=i;
rec%=p;
}
return rec;
}


显然的做法,这里就不再赘述了。

这种做法是显然容易理解的,但是,它实在是不能满足大数据(这里指k特别大的时候)。那么,还有没有一种高效的算法呢?

下面来思考这样一个问题:

对于整数a和n,显然有
a^(2*n)=(a^n)^2
。那么我们的2*n次运算就可以优化成n+1了。其实呢,+1与否其实影响不是太大,主要是,现在发生了一件神奇的事情:我们的n次运算是可以被优化到log2(n)的啦啦啦~~~~

不过,对于
a^(2*n+1)
,要是简单的 /2 的话,那么我们是不是就少算了一次呢?——>其实这 没有 没有 没有 关系~只要我们在存储答案的变量里乘上a,然后不就可以把
a^(2*n+1)
变成
a^(2*n)
了么?

显然,这种算法高效而且很容易懂的吧~

现在贴一贴代码就好了啊~

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int main(){
long long n,m,b,p,k,s=1;
cin>>b>>p>>k;
n=b,m=p;
while(p>0){
if(p%2==1){
p--;
s*=b;
b%=k;
s%=k;
}
if(p%2==0){
p/=2;
b=b*b;
b%=k;
}
}
b%=k;
s%=k;
cout<<n<<"^"<<m<<" mod "<<k<<"="<<s;
return 0;
}


很神奇吧~那我们就等着进入下一步(矩阵乘法和它的快速幂)吧~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: