整数快速幂取余,复杂度为O(lgN),朴素算法为O(N)
32位MOD模板
int getPow(__int64 a, __int64 x, int MOD) /* return a^x 思想:倍增 */
{
__int64 t = ( a % MOD);
__int64 ans = 1;
for(int i=0; (1<<i)<=x; ++i)
{
if(x & (1 << i)) ans *= t;
if( ans >= MOD) ans %= MOD;
t *= t;
if( t >= MOD ) t %= MOD;
}
return (int)ans;
}
64位MOD模板
inline long long mul(long long a, long long b, long long MOD)/* 64位b转化为2进制 */
{
long long ret = 0, temp = a % MOD; /* 这个是必须的 */
while( b )
{
if( b&1 ) if( (ret += temp) >= MOD ) ret -= MOD;
if( (temp <<= 1) >= MOD ) temp -= MOD;
b >>= 1;
}
return ret;
}
inline long long getPow(long long a, long long b, long long MOD)
{
long long ret = 1 % MOD;
while( b )
{
if( b&1 ) ret = mul( ret, a, MOD );
a = mul( a, a, MOD );
b >>= 1;
}
return ret;
}