快速幂取模详解

    很多时候,当我们在做题时会遇到指数级的运算,那么一旦指数大了,运算结果就会非常大,导致电脑存储不下,一旦达到2^31这种时候就自然溢出了。那么取模就很重要了。这里的快速幂取模算法可以大幅优化时间和空间的复杂度。

    首先了解快速幂取模算法的原理:积的取余等于取余的积的取余,意思就是(a*b)%c=((a%c)*(b%c))%c,在此基础上,对指数型的数据进行拆解合并,就是快速幂取模算法。

    那么我们考虑为什么最后a^b会爆掉?就是因为a,b的规模太大,那么就考虑如何缩小规模:

void qumo(int a,int b,int c)            //a为底数,b为指数,c为模数
{
	int sum=1;
	a=a%c;
	for(int i=1;i<=b;++i)
	  sum=(sum*a)%c;
	return sum;
}

​

    显而易见的是,这里只是缩小了a的规模,如果b达到1e10以上的数据那么还是gg,接下来就考虑缩小b的规模:

    对于一个数a^b,很明显它可以化为(a^2)^(b/2),而a的规模又可以通过上面所讲的方式缩小,这样就非常舒服了。如果b为奇数,那么就先将这个数预先处理出来取模即可。

    下面就是代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;

LL quickmod(LL a,LL b,LL c)//a为底数,b为阶数,c为模数
{
   LL a2=a%c;
   LL ans=1;
   while(b)
   {
       if(b%2)             //这里可以用位运算来写,就是b&1; 
	     ans=(ans*a2)%c;
       a2=(a2*a2)%c;
       b=b>>1;
    }
    return ans;
}

int main()

{
	 LL a,b,c;
	 cin>>a>>b>>c;
     LL result=quickmod(a,b,c);
     printf("%lld\n",result);
     return 0;
}

猜你喜欢

转载自blog.csdn.net/g21glf/article/details/81201614