快速幂求解与快速幂取模
快速幂求解与快速幂取模
快速幂求解与快速幂取模
以下内容简单介绍以下有关快速幂的基本知识。
什么是快速幂?
顾名思义,快速幂就是快速算底数的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);
    }
}
    作者:LightAc  
出处:https://www.cnblogs.com/lightac/  
联系:
Email: dzz@stu.ouc.edu.cn  
QQ: 1171613053
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。 

 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号