题目
思路
(二进制思想) O(logn)
如果直接计算a乘b这会超过 long long 的最大范围,所以采用类似于快速幂的思想
快速幂: a*a*a*a...*a 一共b个a
这一题: a+a+a+a...+a 一共b个a
把 b写成二进制形式,然后如果某位上为1就加上它a*(2^n)次方(n与这位的位置有关)
并且每次计算后取模就可以了
例:计算 3*7
7的二进制 111
3*(2^0)=3
3*(2^1)=6
3*(2^2)=12
代码
#include<iostream>
using namespace std;
typedef unsigned long long ULL;
ULL qp(ULL a,ULL b,ULL p){
ULL res=0;
while(b){
if(b&1){
res=(res+a)%p;
}
a=(2*a)%p;
b=b>>1;
}
return res;
}
int main(){
ULL a,b,p;
cin>>a>>b>>p;
cout<<qp(a,b,p)<<endl;
return 0;
}