题意 :Given A,B,C, You should quickly calculate the result of A^B mod C. (1<=A,B,C<2^63).
原始的Quickmod 和 Quickmulti
LL QuickMod(LL a,LL b,LL c)
{
LL ans = 1;
while(b)
{
if(b&1) ans = ans*a%c;
b >>= 1;
a = a*a%c;
}
return ans;
}
LL QuickMulti(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;
}
但是 由于这道题数据给的比较多并且比较大更容易溢出 所以需要进行优化 特别是QuickMod中的乘法 要进行改进 否则会溢出
QuickMulti中也要借鉴快速幂的思想进行优化
优化后的代码
LL multi(LL a,LL b,LL c)
{
LL ret = 0;
while(b)
{
if(b&1)
{
ret += a;
if(ret >= c) ret -= c;
}
a <<= 1;
if(a >= c) a -= c;
b >>= 1;
}
return ret;
}
LL Quick_mod(LL a,LL b,LL c)
{
LL ret = 1;
while(b)
{
if(b&1)
{
ret = multi(a,ret,c);
}
b >>= 1;
a = multi(a,a,c);
}
return ret;
}
这样才能过这道比较恶心的题 时间还是用了 780+ms