快速幂求解与快速幂取模

快速幂求解与快速幂取模

快速幂求解与快速幂取模

以下内容简单介绍以下有关快速幂的基本知识。

什么是快速幂?

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

算法原理

  1. 根本方法思想:位运算

快速幂计算幂

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);
    }
}

猜你喜欢

转载自blog.csdn.net/qq_43591782/article/details/86744592