整数快速幂取余

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值