src/math/ds/mint/bs/lib.hpp
| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | #pragma once | ||
| 2 | |||
| 3 | #include "../../../../nt/mod/barrett/lib.hpp" | ||
| 4 | #include "../_base/lib.hpp" | ||
| 5 | |||
| 6 | namespace tifa_libs { | ||
| 7 | |||
| 8 | template <u64 MOD_> | ||
| 9 | class mint_bs_tag : public mint_impl_::mint_tag_base { | ||
| 10 | static_assert(MOD_ && MOD_ <= UINT32_MAX); | ||
| 11 | using core = barrett<MOD_>; | ||
| 12 | |||
| 13 | public: | ||
| 14 | static CEXP bool FIXED_MOD = true; | ||
| 15 | |||
| 16 | protected: | ||
| 17 | using raw_t = u32; | ||
| 18 | raw_t v_{}; | ||
| 19 | 41221199435 | CEXP mint_bs_tag() NE = default; | |
| 20 | 61942464690 | CEXP mint_bs_tag(int_c auto v) NE : v_{mod(v)} {} | |
| 21 | |||
| 22 | public: | ||
| 23 | 2978125045 | static CEXP raw_t mod(sint_c auto v) NE { | |
| 24 |
9/16unsigned int tifa_libs::mint_bs_tag<1000000007ul>::mod<int>(int):
✓ Branch 0 taken 39078311 times.
✗ Branch 1 not taken.
unsigned int tifa_libs::mint_bs_tag<1000000007ul>::mod<long>(long):
✓ Branch 0 taken 114027477 times.
✗ Branch 1 not taken.
unsigned int tifa_libs::mint_bs_tag<1012924417ul>::mod<int>(int):
✓ Branch 0 taken 368563 times.
✗ Branch 1 not taken.
unsigned int tifa_libs::mint_bs_tag<167772161ul>::mod<int>(int):
✓ Branch 0 taken 69503007 times.
✗ Branch 1 not taken.
unsigned int tifa_libs::mint_bs_tag<469762049ul>::mod<int>(int):
✓ Branch 0 taken 69503007 times.
✗ Branch 1 not taken.
unsigned int tifa_libs::mint_bs_tag<754974721ul>::mod<int>(int):
✓ Branch 0 taken 69503007 times.
✗ Branch 1 not taken.
unsigned int tifa_libs::mint_bs_tag<998244353ul>::mod<int>(int):
✓ Branch 0 taken 559736956 times.
✓ Branch 1 taken 11420 times.
unsigned int tifa_libs::mint_bs_tag<998244353ul>::mod<long>(long):
✓ Branch 0 taken 2056393297 times.
✗ Branch 1 not taken.
|
2978125045 | if (v >= 0) return mod((to_uint_t<decltype(v)>)v); |
| 25 |
1/16unsigned int tifa_libs::mint_bs_tag<1000000007ul>::mod<int>(int):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
unsigned int tifa_libs::mint_bs_tag<1000000007ul>::mod<long>(long):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
unsigned int tifa_libs::mint_bs_tag<1012924417ul>::mod<int>(int):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
unsigned int tifa_libs::mint_bs_tag<167772161ul>::mod<int>(int):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
unsigned int tifa_libs::mint_bs_tag<469762049ul>::mod<int>(int):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
unsigned int tifa_libs::mint_bs_tag<754974721ul>::mod<int>(int):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
unsigned int tifa_libs::mint_bs_tag<998244353ul>::mod<int>(int):
✓ Branch 1 taken 11420 times.
✗ Branch 2 not taken.
unsigned int tifa_libs::mint_bs_tag<998244353ul>::mod<long>(long):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
|
11420 | if (auto ret = mod((to_uint_t<decltype(v)>)-v); ret) return mod() - ret; |
| 26 | ✗ | else return ret; | |
| 27 | } | ||
| 28 | 61942464690 | static CEXP raw_t mod(uint_c auto v) NE { | |
| 29 | 61942464690 | if CEXP (umost64_c<decltype(v)>) return (raw_t)core::reduce((u64)v); | |
| 30 | else if (v < UINT64_MAX) return (raw_t)core::reduce((u64)v); | ||
| 31 | else return raw_t(v % mod()); | ||
| 32 | } | ||
| 33 | 1237346755188 | static CEXP raw_t mod() NE { return MOD_; } | |
| 34 | 26796330039 | ND CEXP raw_t val() CNE { return v_; } | |
| 35 | CEXP raw_t& data() NE { return v_; } | ||
| 36 | |||
| 37 | protected: | ||
| 38 | template <class mint> | ||
| 39 | 430973818 | CEXP auto neg() CNE { | |
| 40 | 430973818 | mint res; | |
| 41 |
5/6auto tifa_libs::mint_bs_tag<1000000007ul>::neg<tifa_libs::mint_impl_::mint<tifa_libs::mint_bs_tag<1000000007ul> > >() const:
✓ Branch 0 taken 1819236 times.
✗ Branch 1 not taken.
auto tifa_libs::mint_bs_tag<1012924417ul>::neg<tifa_libs::mint_impl_::mint<tifa_libs::mint_bs_tag<1012924417ul> > >() const:
✓ Branch 0 taken 1065728 times.
✓ Branch 1 taken 1807937 times.
auto tifa_libs::mint_bs_tag<998244353ul>::neg<tifa_libs::mint_impl_::mint<tifa_libs::mint_bs_tag<998244353ul> > >() const:
✓ Branch 0 taken 424217174 times.
✓ Branch 1 taken 2063743 times.
|
430973818 | if (v_) res.v_ = mod() - v_; |
| 42 | 430973818 | return res; | |
| 43 | } | ||
| 44 | 689674781217 | CEXP void add(mint_bs_tag CR r) NE { | |
| 45 |
12/12tifa_libs::mint_bs_tag<1000000007ul>::add(tifa_libs::mint_bs_tag<1000000007ul> const&):
✓ Branch 1 taken 1725965 times.
✓ Branch 2 taken 82165426 times.
tifa_libs::mint_bs_tag<1012924417ul>::add(tifa_libs::mint_bs_tag<1012924417ul> const&):
✓ Branch 1 taken 2696511994 times.
✓ Branch 2 taken 4077833047 times.
tifa_libs::mint_bs_tag<167772161ul>::add(tifa_libs::mint_bs_tag<167772161ul> const&):
✓ Branch 1 taken 68138345003 times.
✓ Branch 2 taken 93335573557 times.
tifa_libs::mint_bs_tag<469762049ul>::add(tifa_libs::mint_bs_tag<469762049ul> const&):
✓ Branch 1 taken 67799425286 times.
✓ Branch 2 taken 93674493274 times.
tifa_libs::mint_bs_tag<754974721ul>::add(tifa_libs::mint_bs_tag<754974721ul> const&):
✓ Branch 1 taken 67482928321 times.
✓ Branch 2 taken 93990990239 times.
tifa_libs::mint_bs_tag<998244353ul>::add(tifa_libs::mint_bs_tag<998244353ul> const&):
✓ Branch 1 taken 72025217109 times.
✓ Branch 2 taken 126369571996 times.
|
689674781217 | if ((v_ += r.v_) >= mod()) v_ -= mod(); |
| 46 | 689674781217 | } | |
| 47 | 649220959315 | CEXP void sub(mint_bs_tag CR r) NE { | |
| 48 |
12/12tifa_libs::mint_bs_tag<1000000007ul>::sub(tifa_libs::mint_bs_tag<1000000007ul> const&):
✓ Branch 0 taken 294420086 times.
✓ Branch 1 taken 508421134 times.
tifa_libs::mint_bs_tag<1012924417ul>::sub(tifa_libs::mint_bs_tag<1012924417ul> const&):
✓ Branch 0 taken 2676918563 times.
✓ Branch 1 taken 3945872004 times.
tifa_libs::mint_bs_tag<167772161ul>::sub(tifa_libs::mint_bs_tag<167772161ul> const&):
✓ Branch 0 taken 67397243274 times.
✓ Branch 1 taken 94076675286 times.
tifa_libs::mint_bs_tag<469762049ul>::sub(tifa_libs::mint_bs_tag<469762049ul> const&):
✓ Branch 0 taken 67513228040 times.
✓ Branch 1 taken 93960690520 times.
tifa_libs::mint_bs_tag<754974721ul>::sub(tifa_libs::mint_bs_tag<754974721ul> const&):
✓ Branch 0 taken 67649007849 times.
✓ Branch 1 taken 93824910711 times.
tifa_libs::mint_bs_tag<998244353ul>::sub(tifa_libs::mint_bs_tag<998244353ul> const&):
✓ Branch 0 taken 57187922908 times.
✓ Branch 1 taken 100185648940 times.
|
649220959315 | if (i32(v_ -= r.v_) < 0) v_ += mod(); |
| 49 | 649220959315 | } | |
| 50 | 838571446930 | CEXP void mul(mint_bs_tag CR r) NE { v_ = (raw_t)core::reduce(u64(v_) * r.v_); } | |
| 51 | }; | ||
| 52 | template <u64 MOD> | ||
| 53 | using mint_bs = mint_impl_::mint<mint_bs_tag<MOD>>; | ||
| 54 | |||
| 55 | } // namespace tifa_libs | ||
| 56 |