ACM简化取模

平时在做算法题的时候,会遇到结果要对大数取模的情况如1000000007。

所以你写的代码是这样的:

ans = (ans + (((n*(n-1) % mod) * inv(2, mod) %mod) * m %mod + (n *j % mod)) * (b -1 + mod) % mod)%mod; 

可读性极差,所以我设计了一个LLmod类专门处理这种情况,LLmod其实就是一个封装好的long long类型,可以像long long 一样简单的进行cin,cout,加减乘除运算:

class LLmod
{
    typedef long long LL;
public:
    LLmod() {}
    LLmod(LL initial)
    {
        if (initial == -1) {
            val = -1;
        }
        val = (initial % MOD + MOD) % MOD;
    }
    LLmod(LL initial, LL mod) {
        MOD = mod;
        if (initial == -1) {
            val = -1;
        }
        val = (initial % MOD + MOD) % MOD;
    }
    void setMod(int mod) {
        MOD = mod;
    }
    LL value() const
    {
        return val;
    }

    LLmod inv() const
    {
        LL x, y;
        int ans = ex_gcd(val, MOD, x, y);
        if (x < 0)
            x = (x % MOD + MOD) % MOD;
        if (ans == 1)
            return LLmod(x);
        else
            return LLmod(-1);
    }

    friend std::ostream& operator<<(std::ostream& os, const LLmod& obj) {
        os <<  obj.val;
        return os;
    }

    friend std::istream& operator>>(std::istream& is, LLmod& obj) {
        is >> obj.val;
        obj.val = (obj.val % obj.MOD + obj.MOD) % obj.MOD;
        return is;
    }

    LLmod operator+(const LLmod &other) const
    {
        return LLmod(val + other.val);
    }

    LLmod operator-(const LLmod &other) const
    {
        return LLmod(val - other.val);
    }

    LLmod operator*(const LLmod &other) const
    {
        return LLmod(val * other.val);
    }

    LLmod operator/(const LLmod &other)  const
    {
        LLmod inverse = other.inv();
        if (inverse.val == -1) {
            return LLmod(-1);
        }
        return LLmod(val) * inverse;
    }

private:
    LL ex_gcd(LL a, LL b, LL &x, LL &y) const
    {
        if (b == 0)
        {
            x = 1;
            y = 0;
            return a;
        }
        int ans = ex_gcd(b, a % b, x, y);
        int temp = x;
        x = y;
        y = temp - (a / b) * y;
        return ans;
    }
    LL val;
    LL MOD = 1e9 + 7;
};

写一个main函数测一下:

int main() {
    LLmod a, b;
    cin >> a >> b;
    cout << a/b << endl;
    cin >> a >> b;
    cout << a*b << endl;
    cin >> a;
    cout << a.inv() << endl;
    cin >> a >> b;
    cout << a-b << endl;
    cin >> a >> b;
    cout << a+b << endl;
}

嗯,还挺好用的。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值