题目,给定较大的a,b,c 求a^b%c
首先看到题目是用基础的快速幂算法,其模板如下:
inline ll ksm(ll a,ll b,ll mod)
{
if (mod==1)return 0;
ll res=1;
while(b)
{
if(b&1)
res=res*a%mod;
b>>=1;
a=a*a%mod;
}
return res;
}
这就已经很快了吗?还可以继续优化!
比如看到res*a%mod
可以使用O(1)快速乘来继续优化速度,其模板如下
ll mul(ll a,ll b,ll mod)
{
a %= mod;
b %= mod;
return (a*b-((ll)((long double)a/mod*b))*mod+mod)%mod;
}
注意事项:
1. a,b 使用前先取模,不然可能会被卡样例
2. long double需要将a先转成 long double 型 随后对其代数式整体转LL
原始的快速乘
inline ll ksc(ll a, ll b, ll c)
{
ll ans = 0;
while(b)
{
if(b & 1)ans = (ans + a) % c;
b >>= 1;
a = (a + a) % c;
}
return ans;
}
结合以上代码,我们写出优化后的快速幂
ll mul(ll a,ll b,ll mod)
{
a %= mod;
b %= mod;
return (a*b-((ll)((long double)a/mod*b))*mod+mod)%mod;
}
inline ll ksm(ll a,ll b,ll mod)
{
if (mod==1)return 0;
ll res=1;
while(b)
{
if(b&1)
res=mul(res,a,mod);
b>>=1;
a=mul(a,a,mod);
}
return res;
}