标签:type 描述 sha sharp pac clu cin name a*
题目描述:
求 a 乘 b 对 p 取模的值,其中 1 <= a,b,p <= 10^18
输入描述:
第一行a,第二行b,第三行p。
输出描述:
一个整数,表示a * b mod p的值。
实例:
输入: 2 3 9
输出: 6
思想:
这道题是要先算出a*b再对其结果进行求模(取余),因为a和b的最大值为1e+18,我们知道乘法有的时候会溢出,即使是 longlong 也可能在乘法时爆掉。所以我们寻找一种能高效完成乘法操作并且不会爆 longlong 的算法,也就是快速乘。
代码原理
可以把 a * b这样算:
a * b = a + a + a + ...+ a
而
a * 1 = a
a * 2 = 2a
a * 4 = 4a
a * 8 = 8a
...
所以可以推出:
a * (2 ^ k) = 2 ^ k * a
代码
#include<bits/stdc++.h> using namespace std; typedef long long ll; ll qmul(ll a,ll b,ll c) { ll ans=0; ll temp=a; while(b) { if(b&1) ans=(ans+temp)%c; temp=(2*temp)%c; b>>=1; } return ans; } int main() { long long a,b,c; cin>>a>>b>>c; long long ans=qmul(a,b,c); cout<<ans<<endl; }
标签:type 描述 sha sharp pac clu cin name a*
原文地址:https://www.cnblogs.com/Charls/p/12643860.html