每种数据都有一定的范围,这导致乘法有时候会溢出,所以需要用到快速乘来高效完成乘法运算并且不会溢出。
求导过程
求12*11的值
12*11=12*1011(2)=12*2^3*1+12*2^2*0+12*2^1+12*2^0=96+24+12=132
上式先把11转换为二进制1011(2),然后再用进制转换公式把1011展开,通过乘法分配律将乘法的结果拆成多个数的和,最后求合得答案。
快速乘算法的原理就是通过这样,拆分取余,一步一步求合,最后得到结果,所以不至于溢出。
//求(a*b)%p
long long int ans=0;
while(b)
{
if(b&1)//b(2)最右位是否为零
ans=(ans+a)%p;
b>>=1;//b(2)左移
a=(a<<1)%p;//a右移,相当于把a*2
}
题目描述
-求a*b%p的值
格式
输入格式
输入a b p
a,b在long long的范围内
输出格式
a*b%p
样例
样例输入 Copy
2 4 3
样例输出 Copy
2
#include<stdio.h>
#include<string.h>
int main()
{
long long int a,b,p;
while(~scanf("%lld%lld%lld",&a,&b,&p))
{
long long int ans=0;
while(b)
{
if(b&1)//b(2)最右位不是0
{
ans=(ans+a)%p;
}
b>>=1;//b(2)左移
a=(a<<1)%p;
}
printf("%lld\n",ans);
}
return(0);
}