快速幂太常用了, 单开一篇.
举例!
2^100 %100
4^50 %100
16^25 %100
16^24 *16 %100
256^12 *16 %100
(256%100)^12 *16 %100
56^12 *16 %100
3136^6 *16 %100
(3136%100)^6 *16 %100
36^6 *16 %100
1296^3 *16 %100
(1296%100)^3 *16 %100
96^3 *16 %100
96^2 *16*96 %100
9216^1 *1536 %100
(9216%100)^1 *(1536%100) %100
16^1 *36 %100
576%100
76
大概是这么个样子.(蒙混过关的原因是刚刚举例全部打错了, 不打啦!)
应用的原理是, 如果我想计算两个数的积之后取模的结果, 可以分别把两个数取模再相乘
同理我想计算一百万个数的积(就是幂嘛), 我可以把这一百万个数都取个余然后再乘.
关于如何降次,上面有举例的.
模板如下:
long long int quick_pow(long long int a,long long int p,long long int mod)
{//计算(a^p)%mod
long long int res=1;
a=a%mod;
while(p)
{
if(p&1)
res=res*a%mod;
p>>=1;
a=(a*a)%mod;
}
return res;
}
还有一个东西,叫做快速乘
原理很像的.
模板如下
long long int quick_multi(long long int a,long long int p,long long int mod)
{//计算(a*p)%mod
long long int res=0;
a=a%mod;
p=p%mod;
while(p)
{
if(p&1)
res=(res+a)%mod;
p>>=1;
a=(a+a)%mod;
}
return res;
}
好有愧疚感啊, 这么点东西都能水一篇.