求 a 乘 b 对 p
取模的值。
输入格式
第一行输入整数a
,第二行输入整数b,第三行输入整数p
。
输出格式
输出一个整数,表示a*b mod p
的值。
数据范围
1≤a,b,p≤1018
输入样例:
3
4
5
输出样例:
2
#include <stdio.h>
typedef unsigned long long ULL;
int main()
{
ULL a,b,p;
ULL res = 0;
scanf("%llu%llu%llu",&a,&b,&p);
while(b)
{
if(b&1)
res = (res+a) % p;
a = (a + a) %p;
b >>= 1;
}
printf("%llu",res);
}
首先,其别名unsigned long long ULL
b&1 就是 判断b的最低位是否为1,如果为1,就加到res(最终结果);; 这里的b就是一个用二进制来判断 第几次方是否存在。
如 一次方 0000000....001 最低为一,说明 一次方存在
如果是 三的四次方 就是 00000000...100,开始循环a一直在加,到100时 加到结果上
b>>=1 是当前位处理过,就去掉该位