码迷,mamicode.com
首页 > 编程语言 > 详细

数论—快速幂算法

时间:2017-10-05 17:17:46      阅读:187      评论:0      收藏:0      [点我收藏+]

标签:space   pen   游戏   快速幂   mes   ==   long   计算机实现   std   

快速幂顾名思义,就是快速算某个数的多少次幂。其时间复杂度为 O(log?N), 与朴素的O(N)相比效率有了极大的提高。

简单来说,就是个二分求模的过程 。

那么怎么让“聪明”的计算机实现呢?

非递归:
#include<iostream>
using namespace std;
typedef long long ll;
ll a,b,c;
ll kuai(ll x,ll y,ll z)
{
  ll ans=1; x%=z;
  while (y)
  {
    if (y%2==1) ans=ans*x%z;
    y/=2; x=x*x%z; //比如说{3^15=3*(3^7)*(3^7)}%z,就直接可以写成{3*(3*3)^7}%z
  }
return ans;
}
int main()
{
  cin>>a>>b>>c;
  cout<<kuai(a,b,c)<<endl;
  return 0;
}

 

递归版(是一类似模板的题 [NOIP提高组2013]转圈游戏的题解):方法一样
#include<iostream>
using namespace std;
long long n;

long long kuai(int y)//求10的b次幂
{
  if (y==0) return 1;
  else
  {
  long long k;
  k=kuai(y/2);
  if (y%2==0) return k*k%n;
  else return k*k*10%n;
  }
}

int main()
{
  //freopen("circle.in","r",stdin);
  //freopen("circle.out","w",stdout);
  long long m,k,x;
  cin>>n>>m>>k>>x;
  cout<<(m*kuai(k)+x)%n<<endl;
  return 0;
}

数论—快速幂算法

标签:space   pen   游戏   快速幂   mes   ==   long   计算机实现   std   

原文地址:http://www.cnblogs.com/powerfulbee/p/7629411.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!