LG 的数学计划 ---- 第四步 快速幂
2016-09-06 19:52
127 查看
快速幂是解决什么问题的怎么一种神奇的东西呢?
考虑这样一个问题,给出b和k,求出b^k的值,由于结果可能很大,再给出p,只要输出对p取模后的答案就好了。
那么,首先讲讲简单的暴力求法:
显然的做法,这里就不再赘述了。
这种做法是显然容易理解的,但是,它实在是不能满足大数据(这里指k特别大的时候)。那么,还有没有一种高效的算法呢?
下面来思考这样一个问题:
对于整数a和n,显然有
不过,对于
显然,这种算法高效而且很容易懂的吧~
现在贴一贴代码就好了啊~
很神奇吧~那我们就等着进入下一步(矩阵乘法和它的快速幂)吧~
考虑这样一个问题,给出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; }
很神奇吧~那我们就等着进入下一步(矩阵乘法和它的快速幂)吧~
相关文章推荐
- LG的数学计划之素数测试(Miller Rabin算法)
- 1748. The Most Complex Number/LG的数学计划~~~持续更新ing(反素数求解)
- LG的数学计划----EXGCD
- LG 的数学计划 ---- 第一步 素数判定
- LG 的数学计划 ---- 第二步 进制转换
- 数学公式+矩阵快速幂 hdu-4565 So Easy!
- [POJ 3734] Blocks (矩阵快速幂、组合数学)
- 矩阵快速幂 [HNOI2011]数学作业
- 【codevs1851】越狱,快速幂数学
- Silverlgiht:快速去除/恢复对象的颜色
- [Codeforces677C]Vanya and Label(组合数学,快速幂)
- 《3D游戏和图形学的数学方法》快速阅读记录...
- muParser—快速的数学表达式解析器库
- POJ 2154 Color(组合数学-波利亚计数,数论-欧拉函数,整数快速幂)
- codeforces B. Ralph And His Magic Field 数学题+快速幂
- 循规蹈矩:快速读懂SQL执行计划的套路与工具 - ORACLE
- 快速入门git第四步
- 【专题】—【数学】—【矩阵快速幂】
- ZOJ 2853 Evolution (矩阵快速幂+数学)
- Hdu 2256 Problem of Precision[矩阵快速幂 + 数学]