关于大数取模

来源:互联网 发布:三明治板的刚度矩阵 编辑:程序博客网 时间:2024/06/03 17:38

常常遇到的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那还取什么模,直接就是高精度了。。。


0 0
原创粉丝点击