Skip to content

Commit d29c96f

Browse files
committed
refactor: simplify logic
1 parent af191b5 commit d29c96f

File tree

1 file changed

+6
-8
lines changed

1 file changed

+6
-8
lines changed

math/ncr_modulo_p.cpp

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -116,15 +116,12 @@ class NCRModuloP {
116116
return 1;
117117
}
118118
// fac is a global array with fac[r] = (r! % p)
119-
int64_t denominator = utils::modInverse(fac[r], p);
120-
if (denominator < 0) { // modular inverse doesn't exist
119+
const auto denominator = (fac[r] * fac[n - r]) % p;
120+
const auto denominator_inv = utils::modInverse(denominator, p);
121+
if (denominator_inv < 0) { // modular inverse doesn't exist
121122
return -1;
122123
}
123-
denominator = (denominator * utils::modInverse(fac[n - r], p)) % p;
124-
if (denominator < 0) { // modular inverse doesn't exist
125-
return -1;
126-
}
127-
return (fac[n] * denominator) % p;
124+
return (fac[n] * denominator_inv) % p;
128125
}
129126
};
130127
} // namespace ncr_modulo_p
@@ -156,7 +153,8 @@ static void tests() {
156153
TestCase(20, 17, 1, 10, 0),
157154
TestCase(45, 19, 23, 1, 23 % 19),
158155
TestCase(45, 19, 23, 0, 1),
159-
TestCase(45, 19, 23, 23, 1)};
156+
TestCase(45, 19, 23, 23, 1),
157+
TestCase(20, 9, 10, 2, -1)};
160158
for (const auto& tc : test_cases) {
161159
assert(math::ncr_modulo_p::NCRModuloP(tc.size, tc.p).ncr(tc.n, tc.r) ==
162160
tc.expected);

0 commit comments

Comments
 (0)