位运算 - 六十四位整数乘法

abp

取模的值。

输入格式

第一行输入整数a

,第二行输入整数b,第三行输入整数p

输出格式

输出一个整数,表示a*b mod p的值。

数据范围

1a,b,p1018

输入样例:

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 是当前位处理过,就去掉该位

猜你喜欢

转载自www.cnblogs.com/gufana/p/10472269.html