方法1:类似快速幂的思路,快速幂是连乘,这里就是连加时间复杂度O(log2b)
代码:
#include <iostream>
#include <cstdio>
using namespace std;
typedef long long ll;
ll mul(ll a,ll k,ll p)
{
ll res=0;
while(k)
{
if(k&1) res=(res+a)%p;
a=a*2%p;
k>>=1;
}
return res;
}
int main()
{
ll a,b,p;
cin>>a>>b>>p;
cout<<mul(a,b,p);
return 0;
}
方法2: 时间复杂度O(1)
#include <iostream>
#include <cstdio>
using namespace std;
typedef unsigned long long ull;
ull mul(ull a,ull b,ull p)
{
a%=p,b%=p;
ull c=(long double)a*b/p;
ull x=a*b,y=c*p;
long long ans=(long long)(x%p)-(long long)(y%p);
if(ans<0)ans+=p;
return ans;
}
int main()
{
ull a,b,p;
cin>>a>>b>>p;
cout<<mul(a,b,p);
return 0;
}