Index: lib/numeric/modArith.cpp ================================================================== --- lib/numeric/modArith.cpp +++ lib/numeric/modArith.cpp @@ -2,20 +2,21 @@ //------------------------------------------------------------- // Modulo Arithmetics // // Verified by // - TCO10 R3 LV3 +// - SRM 545 LV2 //------------------------------------------------------------- -static const int MODVAL = 1000000007; // must be prime for op/ +static const int MODVAL = 1000000007; struct mint { int val; mint():val(0){} - 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(int x):val(x%MODVAL) {} + mint(size_t x):val(x%MODVAL) {} + mint(LL x):val(x%MODVAL) {} }; 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; } @@ -26,10 +27,21 @@ 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 > CP_(2001); +mint C(LL n, LL k) { + if(CP_[0].empty()) { + CP_[0].push_back(1); + for(int nn=1; nn