平时在做算法题的时候,会遇到结果要对大数取模的情况如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;
}
嗯,还挺好用的。