#include <bits/stdc++.h>
using namespace std;
//简单来说就是把b当成2进制形式,然后累加;
// 2*7=2*(1*2^0+1*2^1+1*2^2)=2*1*2^0+2*1*2^1+2*1*2^2;
long long FastMul(long long a,long long b) //快速积 a*b
{
long long ans=0;
while(b){
if(b&1) //二进制数b各位如果为1
ans+=a;
a+=a;
b>>=1; //右移1位,相当于除以2
}
return ans;
}
long long FastExp(long long a,long long b) //快速幂 a^b
{
long long ans=1;
while(b){
if(b&1)
ans*=a;
a*=a;
b>>=1;
}
return ans;
}
//快速积取模简单来说就和上面说明一样,只是每次多一个取余过程,下次运算加上上次的余数;
// 2*7%5=2*(1*2^0+1*2^1+1*2^2)%5=(2*1*2^0%5+2*1*2^1%5+2*1*2^2%5)%5 (不知道是不是这样表达的,嘻嘻)
long long FastMulMod(long long a,long long b,long long c) //快速积取模 a*b%c
{
long long ans=0;
while(b){
if(b&1)
ans=(ans+a)%c;
a=(a+a)%c;
b>>=1;
}
return ans;
}
long long FastExpMod(long long a,long long b,long long c) //快速幂取模 a^b%c
{
long long ans=1;
while(b){
if(b&1)
ans=(ans*a)%c;
a=(a*a)%c;
b>>=1;
}
return ans;
}
int main()
{
printf("%ld\n",FastMul(100,100));
printf("%ld\n",FastExp(2,10));
printf("%ld\n",FastMulMod(3,93,5));
printf("%ld\n",FastExpMod(2,9,5));
return 0;
}