位運算 90. 64位整數乘法

求 a 乘 b 對 p 取模的值。

輸入格式

第一行輸入整數 a,第二行輸入整數 b,第三行輸入整數 p。

輸出格式

輸出一個整數,表示a*b mod p的值。

數據範圍

1≤a,b,p≤1e18

輸入樣例:

3
4
5

輸出樣例:

2

差點粘個大數板子2333

思路:

1. b = b1 + b2 + b3 , a * b % p = ( a * b1 % p + a * b2 % p + a * b3 % p ) % p

2.這題依舊利用位運算防止爆 long long

3.b 可以被拆成 b = bit(0)*2(0) + bit(1)*2(1) + bit(2)*2(2)······

4. a * b % p = a * (bit(0)*2(0)) + a * (bit(1)*2(1)) + a * (bit(2)*2(2))······

5.當bit(i) == 0 時 a * (bit(i)*2(i)) == 0,當bit(i) == 1時需要把答案加上,每循環一次 a = a * 2 % p 將 a 與 2(i) 同時計算 

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

int main()
{
    ll a, b, p, ans=0;
    scanf("%lld%lld%lld", &a, &b, &p);
    while(b)
    {
        if(b & 1)
            ans = (ans + a) % p;
        a = a * 2 % p;
        b >>= 1;
    }
    printf("%lld", ans);
    return 0;
}

 

發佈了10 篇原創文章 · 獲贊 1 · 訪問量 1219
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章