關於大數取模
阿新 • • 發佈:2019-02-17
常常遇到的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那還取什麼模,直接就是高精度了。。。