1. 程式人生 > >關於大數取模

關於大數取模

常常遇到的mod再大也只是1e9+7之類int範圍內的數

然後在a*b%mod的時候只需要把a,b開成long long就避免了溢位問題

但是如果mod 是一個很大很大的數呢?(<2^63)

這樣即使a,b全是long long型,在相乘的時候依舊會溢位

之前看大素數測定的時候看到一個方法:

a*b%c:

typedef long long ll;
ll mult_mod (ll a,ll b, ll c)  
{  
    a%=c,b%=c;  
    ll ret = 0;  
    ll tmp = a;  
    while (b)  
    {  
        if (b&1)  
        {  
            ret += tmp;  
            if (ret > c) ret -= c;  
        }  
        tmp<<=1;  
        if (tmp>c) tmp-=c;  
        b>>=1;  
    }  
    return ret;  
} 

a^n%mod:
ll pow_mod(ll a,ll n,ll mod)  
{  
    ll ret = 1;  
    ll temp = a%mod;  
    while (n)  
    {  
        if (n&1) ret = mult_mod(ret,temp,mod);  
        temp = mult_mod(temp,temp,mod);  
        n>>=1;  
    }  
    return ret;  
}

另外,對於用字串表示的數字取模:

ll getr(string s,ll mod)
{
    ll r = 0;
    for (int i = 0;i < s.size();++i)
    {
        r = (mul_mod(r,10,mod) + (ll)(s[i]-'0'))%n;
    }
    return r;
}

上面這個在做一個題目中用過,數字會達到很大很大,而模不大:點選開啟連結

還沒有遇到模本身大到超出long long範圍的,不過覺得應該不會出現

一般取模都是為了結果不超long long 如果模都超long long那還取什麼模,直接就是高精度了。。。