处理两数相乘的黑科技

黑科技来源

我们发现如果两个数都接近long long,乘起来就爆掉了,那该怎么办。

黑科技内容

快速乘

简介

这个应该是白科技。
虽然叫快速乘,但是十分的慢。
速度比快速幂多一个log 。
比如说是a*b,我们设f(i)=a*i
那么把b拆一下,f(b)=f(b/2) * 2+a *(b mod 2)
递归的做

Code
ll qsc(ll x,ll y){
    ll z=0;
    if(y==0)return z;
    z=qsc(x,y/2);
    z=z*2%m;
    if(y%2==1)z=(z+x)%m;
    return z;
}

黑科技1号

简介

速度很快。
假如要把x和y相乘
我们把x,y分成x/p,x%p,y/p,y%p,p是一个很大的数,用来把大数分开,然后x=(x/p+x%p),y=(y/p+y%p),然后再用乘法分配律把答案算出来。
思想就是把一个数拆成两个数。

Code
ll qsc(ll x,ll y){
    ll a1=x/1000000,a2=x%1000000,b1=y/1000000,b2=y%1000000,z=0;
    z=(a1*b1%mo*1000000%mo*1000000%mo);
    z=(z+a1*b2%mo*1000000%mo);
    z=(z+a2*b2%mo);
    z=(z+a2*b1%mo*1000000%mo);
    return z%mo;
}

黑科技2号

简介

速度也很快。
思想是double可以处理很大的数,然后把long long的数强制转成double的,然后在强制转回来就可以了。
数太大了,很能有精度问题。
所以我还是推荐黑科技1号

Code

来自Yves___的博客long long相乘取模黑科技

LL mult( LL A, LL B, LL Mo )
{
    LL temp = ( ( LL ) ( ( db ) A*B/Mo+1e-6 ) * Mo );
    return A*B - temp;
}

黑科技应用

随机数生成器
WYF的盒子

你可能感兴趣的:(快速乘,黑科技,模板)