acwing 90. 64位整數乘法
求 a 乘 b 對 p 取模的值。
輸入格式
第一行輸入整數a,第二行輸入整數b,第三行輸入整數p。
輸出格式
輸出乙個整數,表示a*b mod p的值。
資料範圍
1≤a,b,p≤1018
輸入樣例:
3
45
輸出樣例:
2
剛開始看到這個題的時候,我是想到的是質因子相乘,然後最後求解。
#includeusing namespace std;
typedef long long ll;
int main(void)
} res=(ll)res*a%p;
for(ll i=2;i<=b/i;i++)
} res=(ll)res*b%p;
cout
}
這個思路很好,但是沒有做出來,原因在於:
會存在極大極大的質數,讓你直接溢位。
我的思路可能錯了,然後我想到了用快速冪類似的方法,快速冪是用的類似位運算的方法,然後我改進了一下,把相乘變成加減,最後實現了乙個快速乘的演算法。
**如下:
#includeusing namespace std;
typedef long long ll;
ll a,b,p;
ll quickpow(ll k)
return res;
}int main(void)
我還發現了很bug的做法
用gcc的128位去做,很神奇,不知道怎麼實現的
#includeusing namespace std;
typedef long long ll;
int main(void)
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解題思路 首先這道題目想到的第乙個思路是直接做乘法,然後再取模,但是...
AcWing 90 64位整數乘法
求 a 乘 b 對 p 取模的值。輸入格式 第一行輸入整數a 第二行輸入整數b,第三行輸入整數p 輸出格式 輸出乙個整數,表示a b mod p的值。資料範圍 1 a b,p 1018 1 a,b,p 10 1 a,b,p 10 18輸入樣例 3 45輸出樣例 2模板 intfp int a,int...