快速幂求解与快速幂取模
快速幂求解与快速幂取模
以下内容简单介绍以下有关快速幂的基本知识。
什么是快速幂?
顾名思义,快速幂就是快速算底数的n次幂。其时间复杂度为 O(log₂N), 与朴素的O(N)相比效率有了极大的提高。
算法原理
- 根本方法思想:位运算
快速幂计算幂
int pow(int a,int b){
int r=1,base=a;
while(b){
if(b&1) r*=base;
base*=base;
b>>=1;
}
return r;
}
板子,记住就好。
快速幂求模
long long powM(long long a, long long b, long long mode)
{
long long sum = 1;
a = a % mode;
while (b > 0) {
if (b % 2 == 1) //判断是否是奇数,是奇数的话将多出来的数事先乘如sum
sum = (sum * a) % mode;
b /= 2;
a = (a * a) % mode;// 不断的两两合并再取模,减小a和b的规模
}
return sum;
}
板子,记住就好。
来道题http://poj.org/problem?id=1995
题解如下:
#include<cstdio>
using namespace std;
long long powM(long long a, long long b, long long mode)
{
long long sum = 1;
a = a % mode;
while (b > 0) {
if (b % 2 == 1) //判断是否是奇数,是奇数的话将多出来的数事先乘如sum
sum = (sum * a) % mode;
b /= 2;
a = (a * a) % mode;// 不断的两两合并再取模,减小a和b的规模
}
return sum;
}
int main ()
{
long long int N;
scanf("%lld",&N);
for(long long int i = 0;i < N;i++)
{
long long int M;
scanf("%lld",&M);
long long int n;
scanf("%lld",&n);
long long int sum = 0;
for(long long int j = 0;j < n;j++){
long long int m,n;
scanf("%lld%lld",&m,&n);
sum += pow(m,n,M);
}
sum %= M;
printf("%lld\n",sum);
}
}