快速幂取模算法
快速幂,即快速幂取模。
例如: a^b mod c
一般算法
int ans=1;
for(int i=1;i<=b;i++)
{
ans=ans*a;
}
ans=ans%c;
a 和 b 过大时很容易溢出
改进:
根据离散数学中的算法:
a^b modc=(a mod c)^b mod c
int ans=1;
a=a%c;
for(inti=1;i<=b;i++)
{
ans=(ans*a)%c
}
ans=ans%c;
但在c过大的情况下仍有可能超时。
所以推出以下快速幂算法
因为 根据二进制的方式 b=an*2^n+an-1*2^n-1+an-2*2^n-2+...a0
此时 b%2=a0;
b=b/2 后则 b%2=a1
b=b/2后则 b%2=a2;
以此类推下去
如果 an(n=0,1,2,3,4...)=1
则相乘,否则所乘上的那一项就相当于是1所以就不乘
int ans=1;
a=a%c;
while(b>0)
{
if(b%2==1)
ans=(ans *a)%c;
b=b/2;
a=(a*a)%c;
}
cout<<ans<<endl;
快速幂,即快速幂取模。
例如: a^b mod c
一般算法
int ans=1;
for(int i=1;i<=b;i++)
{
ans=ans*a;
}
ans=ans%c;
a 和 b 过大时很容易溢出
改进:
根据离散数学中的算法:
a^b modc=(a mod c)^b mod c
int ans=1;
a=a%c;
for(inti=1;i<=b;i++)
{
ans=(ans*a)%c
}
ans=ans%c;
但在c过大的情况下仍有可能超时。
所以推出以下快速幂算法
因为 根据二进制的方式 b=an*2^n+an-1*2^n-1+an-2*2^n-2+...a0
此时 b%2=a0;
b=b/2 后则 b%2=a1
b=b/2后则 b%2=a2;
以此类推下去
如果 an(n=0,1,2,3,4...)=1
则相乘,否则所乘上的那一项就相当于是1所以就不乘
int ans=1;
a=a%c;
while(b>0)
{
if(b%2==1)
ans=(ans *a)%c;
b=b/2;
a=(a*a)%c;
}
cout<<ans<<endl;