原题链接:https://www.acwing.com/problem/content/92/
题目分析
有2种方法,不能直接相乘,因为中间计算会因为数据过大错误(32次方量级)
c++代码
方法一
- int可以存储2e9而longlong可以存储9e18,所以abp的值可以存进去、
- 转为浮点数进行运算,可以到达32次方,防止中间爆掉
typedef long long ll;
ll mul(ll a, ll b, ll p){
a %= p, b %= p;
ll c = (long double)a * b / p;
ll ans = (a * b - c * p) % p;
return ans < 0 ? ans + p : ans;
}
方法二:
把一个乘数写成二进制,就类似于快速幂的思想
int main()
{
ll a,b,p,res;
cin>>a>>b>>p;
res=0;
while(b)
{
if(b&1)res=(res+a)%p;
b>>=1;
a=2*a%p;
}
cout<<res<<endl;
return 0;
}