快速积 a*b
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll FastMul(ll a, ll b)
{
ll ans=0;
while(b)
{
if(b&1)
{
ans+=a;
}
a+=a;
b>>=1;
}
return ans;
}
快速积 + 模 a*b%c
ll FastMulMod(ll a,ll b,ll c)
{
ll ans=0;
while(b)
{
if(b&1)
{
ans=(ans+a)%c;
}
a=(a+a)%c;
b>>=1;
}
return ans;
}
快速幂 a^b
ll FastExp(ll a,ll b)//类比a*b
{
ll ans=1;
while(b)
{
if(b&1)
{
ans*=a;
}
a*=a;
b>>=1;
}
return ans;
}
快速幂 加 模 a^b%p
ll FastExpMod(ll a,ll b,ll p)
{
ll ans=1;
while(b)
{
if(b&1)
{
ans=(ans*a)%p
}
a=(a*a)%p;
b>>=1;
}
return ans;
}
又由于(a ∗ * ∗b)%c == a ∗ * ∗(b%c),且位运算更快
所以有加速版
ll FastMulMod(ll a,ll b,ll c)
{
ll ans=0;
a%=c;
b%=c;
while(b)
{
if(b&1)
{
ans+=a;
}
if(ans>=c)
{
ans-=c;
}
a<<=1;
if(a>=c)
{
a-=c;
}
b>>=1;
}
return ans;
}