modを常に保持するint
プログラミングコンテストでは、
「mod 100000007 で答えよ。」
みたいな問題がしばしば出題されますが、よくmod取るのを忘れるので、常にmodを保持するint型、modintを作ってみた。
template<int mod> class modint { private: int _num; modint set(int num){ _num = num % mod; return *this; } public: modint(){ _num = 0; } modint(int num){ _num = num % mod; } modint operator= (int x){ return set(x % mod); } modint operator+ (int x){ return modint<mod>(_num + (x % mod)); } modint operator- (int x){ return modint<mod>(_num - (x % mod)); } modint operator* (int x){ return modint<mod>(_num * (x % mod)); } modint operator+=(int x){ return set(_num + (x % mod)); } modint operator-=(int x){ return set(_num - (x % mod)); } modint operator*=(int x){ return set(_num * (x % mod)); } explicit operator int() { return _num; } friend ostream& operator<<(ostream &os, const modint<mod> &x){ os << x._num; return os; } }; void run(void){ /* entry point */ modint<5> ans = 11; ans += 7; cout << ans << endl; // 3 }