方法一
類似快速冪的思想,把整數 b 用二進位制表示,即b=c(k-1)pow(2,k-1)+c(k-2)pow(2,k-2)+......+c(0)pow(2,0)
,那麼a*b=c(k-1)*a*pow(2,k-1)+c(k-2)*a*pow(2,k-2)+......+c(0)*a*pow(2,0)
。
因為a*pow(2,i)=(a*pow(2,i-1))*2
,若已求出a*pow(w,i-1) mod p
,則計算(a*pow(2,i-1))*2 mod p
時,運算過程中每一步的結果都不超過2*pow(10,18)
,仍然在64位整數 longlong 的表示範圍內,所以很容易通過 k 次遞推求出每個乘積項。當 c(i)=1 時,把乘積項累加到答案中即可。
樣例**
#includeusing namespace std;
unsigned long long mul(unsigned long long a,unsigned long long b,unsigned long long p)
int main()
cout << res;
return 0;
}
位運算 90 64位整數乘法
求 a 乘 b 對 p 取模的值。輸入格式 第一行輸入整數 a,第二行輸入整數 b,第三行輸入整數 p。輸出格式 輸出乙個整數,表示a b mod p的值。資料範圍 1 a,b,p 1e18 輸入樣例 3 45輸出樣例 2差點粘個大數板子2333 思路 1.b b1 b2 b3 a b p a b1...
AcWing90 64位整數乘法
快速冪 二分 拆分,一方面二分消除重複計算,另一方面將超過表示範圍的運算降為結果在資料範圍內的運算。其一,ll的表示範圍為略低於2 64,兩個六十四位數相加就可以用unsigned ll儲存,變乘法為加法。其二,對於二分,將b用二進位制表示,將運算拆為移位和加法或乘法。對於具體的演算法,一般快速冪a...
AcWing 90 64位整數乘法
64位整數乘法 求 a 乘 b 對 p 取模的值。輸入格式 第一行輸入整數a,第二行輸入整數b,第三行輸入整數p。輸出格式 輸出乙個整數,表示a b mod p的值。資料範圍 1 a,b,p 1018 輸入樣例 34 5輸出樣例 2解題思路 首先這道題目想到的第乙個思路是直接做乘法,然後再取模,但是...