图片说明
我们可以发现,如果将a和b直接进行相乘的话,那肯定会爆long long。当然,python选手自动忽略。那么,我们可以这样思考,对于任意一个整数,我们都可以用二进制进行表示,也就是用二进制进行拆分,比如:b=2^n+2^(n-1)+...+2^3+2^0.所以我们就可以把ab=a2^n+a2^(n-1)+...+a2^3+a2^0,这样,我们就是分别进行一个快速幂,然后累加到答案即可。其实可以把b想象成一个01二进制串,然后,我们可以通过将b不断进行向右进行移位的方式进行求解,其实就是和快速幂非递归的思路差不多。

#include<iostream>
using namespace std;
typedef long long ll;
ll a,b,p;
int main(){
    cin>>a>>b>>p;
    ll ans=0;
    while(b){  //将b想象成01串
        if(b&1) ans=(ans+a)%p; //如果这一位为1,那么它就对结果有权,计算出累加到答案即可
        a=a*2%p;  //这里可以确保a不会爆longlong
        b>>=1; //不断将b进行右移位
    }
    cout<<ans<<endl;
    return 0;
}
//python一步解决
a=int(input())
b=int(input())
p=int(input())
ans=a*b
ans%=p
print(a*b%p)