快速读入 线性求逆元

来源:互联网 发布:科力达传输软件 编辑:程序博客网 时间:2024/05/22 00:52

#多校赛2017#
#模板#

出题人给的黑科技:

namespace fastIO {    #define BUF_SIZE 100000    //fread -> read    bool IOerror = 0;    inline char nc() {        static char buf[BUF_SIZE], *p1 = buf + BUF_SIZE, *pend = buf + BUF_SIZE;        if(p1 == pend) {            p1 = buf;            pend = buf + fread(buf, 1, BUF_SIZE, stdin);            if(pend == p1) {                IOerror = 1;                return -1;            }        }        return *p1++;    }    inline bool blank(char ch) {        return ch == ' ' || ch == '\n' || ch == '\r' || ch == '\t';    }    inline void read(int &x) {        char ch;        while(blank(ch = nc()));        if(IOerror)            return;        for(x = ch - '0'; (ch = nc()) >= '0' && ch <= '9'; x = x * 10 + ch - '0');    }    #undef BUF_SIZE};

线性求逆元:

    iact[1] = 1;    for(int i = 2; i < maxn; ++i)        iact[i] = mod - (int)(mod / i * (LL)iact[mod % i] % mod);    fact[0] = iact[0] = 1;    for(int i = 1; i < maxn; ++i)    {        fact[i] = (LL)fact[i - 1] * i % mod;        iact[i] = (LL)iact[i - 1] * iact[i] % mod; //此处为求阶乘的逆元    }