整数快速幂取余

整数快速幂取余,复杂度为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<= 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;
}


你可能感兴趣的:(ACM回忆)