Index: lib/numeric/modArith.cpp ================================================================== --- lib/numeric/modArith.cpp +++ lib/numeric/modArith.cpp @@ -9,29 +9,29 @@ static const int MODVAL = 1000000007; // must be prime for op/ struct mint { int val; mint():val(0){} - mint(int x):val(x%MODVAL) {} - mint(LL x):val(x%MODVAL) {} + mint(int x):val(x%MODVAL) {} // x>=0 + mint(size_t x):val(x%MODVAL) {} // x>=0 + mint(LL x):val(x%MODVAL) {} // x>=0 }; -mint operator+(mint x, mint y) { return x.val+y.val; } -mint operator-(mint x, mint y) { return x.val-y.val+MODVAL; } -mint operator*(mint x, mint y) { return LL(x.val)*y.val; } -mint POW(mint x, int e) { - mint v = 1; - for(;e;x=x*x,e>>=1) - if(e&1) - v=v*x; - return v; -} -mint operator/(mint x, mint y) { return x * POW(y, MODVAL-2); } +mint& operator+=(mint& x, mint y) { return x = x.val+y.val; } +mint& operator-=(mint& x, mint y) { return x = x.val-y.val+MODVAL; } +mint& operator*=(mint& x, mint y) { return x = LL(x.val)*y.val; } +mint POW(mint x, LL e) { mint v=1; for(;e;x*=x,e>>=1) if(e&1) v*=x; return v; } +mint& operator/=(mint& x, mint y) { return x *= POW(y, MODVAL-2); } +mint operator+(mint x, mint y) { return x+=y; } +mint operator-(mint x, mint y) { return x-=y; } +mint operator*(mint x, mint y) { return x*=y; } +mint operator/(mint x, mint y) { return x/=y; } +vector FAC_(1,1); +mint FAC(LL n) { while( FAC_.size()<=n ) FAC_.push_back( FAC_.back()*FAC_.size() ); return FAC_[n]; } +mint C(LL n, LL k) { return k<0 || n FAC_(1,1); -void FAC_INIT(int n) { while( FAC_.size()<=n ) FAC_.push_back( FAC_.back()*FAC_.size() ); } -mint FAC(mint x) { return FAC_[x.val]; } -mint C(mint n, mint k) { return k.val<0 || n.val