快速乘 乘法取模黑科技

版权声明:转载请注明 https://blog.csdn.net/qq_33831360/article/details/88662423
算a*b%p时,a,b,p在long long范围内,但a*b会炸long long,不用写高精

// Orz  http://www.doc88.com/p-1197280421746.html
//1 模仿快速幂

LL fast_multi(LL m, LL n, LL mod)//快速乘法 
{
    LL ans = 0;//注意初始化是0,不是1 
    while (n)
    {
        if (n & 1)
            ans += m;
        m = (m + m) % mod;//和快速幂一样,只不过这里是加 
        m %= mod;//取模,不要超出范围 
        ans %= mod;
        n >>= 1;
    }
    return ans;
}

//2玄学
//http://tieba.baidu.com/p/3571454303
LL mul(LL a,LL b,LL p){
	return (a*b-(LL)(a/(long double)p*b+1e-3)*p + p)%p;
}
// or 同玄学
LL mult( LL A, LL B, LL Mo )
{
    LL temp = ( ( LL ) ( ( db ) A*B/Mo+1e-6 ) * Mo );
    return A*B - temp;
}

//3 瞎搞
ll qsc(ll x,ll y){
    ll a1=x/1000000,a2=x%1000000,b1=y/1000000,b2=y%1000000;
    ll t=a1*b1%p*1000000%p*1000000%p;
    t=(t+a2*b2%p);
    t=(t+a1*b2%p*1000000%p);
    t=(t+a2*b1%p*1000000%p);
    return t%p;
}

猜你喜欢

转载自blog.csdn.net/qq_33831360/article/details/88662423
今日推荐