题目:
问题 A: 快速乘
描述
a*b%p的值
格式
输入格式
输入a b p
a,b在long long的范围内
输出格式
a*b%p
样例
样例输入 Copy
2 4 3
样例输出 Copy
2
这一题是说a,b在long long 范围内,但结果不一定,所以不能用普通的乘,可以用快速乘,举个简单例子:12x11(1011)
1.122^31=96 (a=96)
2.122^20=0 (a=24,这一步在循环里应该是00000110&00000001,结果是零,所以不加上)
3.122^11=24 (a=24)
4.122^01=12 (a=12)
加起来跟普通乘法答案都是132
代码:
#include <stdio.h>
#include <string.h>
#include <math.h>
main()
{
long long a,b,mod,res;
while(scanf("%lld %lld %lld",&a,&b,&mod)!=EOF)
{
res=0;
while(b)
{
if(b&1) res=(res+a)%mod; //1的二进制是00000001,而&运算时两个都是1才是1,比如11111110&00000001的结果就是0,而00001011&00000000就是1,那么这时就加个a,刚好对应二进制中的每一个1,下面的语句就是累加本身
a=(a+a)%mod; //每算一次就加个本身,相当于一只增大,因为是二进制,比如1011,对应2^3,2^2,2^1,2^0,从后往前就是不断加个本身
b/=2; //求二进制普遍用法
}
printf("%lld\n",res);
}
}