《算法竞赛进阶指南》 第一章 Acwing 90. 64位整数乘法

地址 https://www.acwing.com/problem/content/description/92/

求 a 乘 b 对 p 取模的值。

输入格式
第一行输入整数a,第二行输入整数b,第三行输入整数p。

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

数据范围
1≤a,b,p≤10^18
输入样例:
3
4
5
输出样例:
2

解答 这题目和a^b类似

都是快速幂的思路

b可以表示b个a相加,但是我们不必单个a相加b次

而是将b分解成2的n次方  比如7 = 20+21+22=1+2+4

4个a相加不必a连续相加4次而是使用前面2*a的结果 相加两次即可。

a*7就拆解成   a+ 2*a + 4*a  只需要三次运算即可

使用位运算分解b b连续的循环右移  查看b&1看看b的最低为是否为1 决定是否有a需要相加

#include <iostream>

using namespace std;

long long  a ,b,p,ans=0;

int main(){
    cin >>a >>b>>p;
    while(b!=0){
        if(b&1) ans = (ans +a) %p;
        b>>=1;
        a = (a+a)%p;
    }
    cout << ans%p<<endl;
    return 0;
    
}

 

posted on 2021-03-21 17:54  itdef  阅读(83)  评论(0编辑  收藏  举报

导航