常常遇到的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;