今天本来打算整理学长昨天讲的问题,结果下午…不多说了,快上正经事
知识点一:
快速幂
在介绍快速幂之前我们先引进一个取模方法
例题:
求A^B的最后三位数表示的整数。 说明:A^B的含义是“A的B次方”
对此问题我们不难直接进行for循环将A累乘B次,但当A与B足够大时,我们也会发现它会爆数,因此我们使用下面方法,防止爆数
#define LL long long
LL fun2(LL a,LL b)
{
LL sum;
for(int i=0;i<b;i++)
{
sum=sum*a;
sum%=1000;
}
return sum;
}
在这里我们先进行操作再进行取最后三位数字;
因为(a+b)%p=(a%p+b%p)%p
(ab)%p=(a%pb%p)%p
这这里的快速幂主要是使用第二个
const long long mod =1e9+7;
long long qpow(long long a,long long b)
{
long long t=1;
a%=mod;
while(b)
{
if(b%2==1)
{
t=t*a%mod;
}
a*=a;
b/=2;
}
return t;
}
知识点二:
快速乘
long long qmul(long long a,long long b)
{
long long t=0;
while(b)
{
if(b%2==1)
{
t=t+a;
}
a+=a;
b/=2;
}
return t;
}
其实快速幂与快速乘类似,都是依靠二进制的原理进行一定的操作变值