数论—快速幂算法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数论—快速幂算法相关的知识,希望对你有一定的参考价值。

快速幂顾名思义,就是快速算某个数的多少次幂。其时间复杂度为 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;
}

以上是关于数论—快速幂算法的主要内容,如果未能解决你的问题,请参考以下文章

[数论+模板] 快速幂及快速幂求逆元算法模板(模板)

数论—快速幂算法

打工人必会的快速幂算法详解

矩阵快速幂专题

《夜深人静写算法》数论篇 - (16) 费马小定理

数论笔记-同余