数论—快速幂算法
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;
}
以上是关于数论—快速幂算法的主要内容,如果未能解决你的问题,请参考以下文章