using
System;
using
System.Collections.Generic;
class
GFG {
public
int
nCrModM(
int
n,
int
r,
int
p)
{
List<
int
> primes = findPrimeFactors(p);
List<
int
> rem =
new
List<
int
>();
foreach
(
var
m
in
primes) rem.Add(Lucas(n, r, m));
int
min_x = 0;
while
(
true
) {
bool
found =
true
;
for
(
int
i = 0; i < primes.Count; i++) {
if
(min_x % primes[i] != rem[i]) {
found =
false
;
break
;
}
}
if
(found) {
return
min_x;
}
min_x++;
}
}
int
Lucas(
int
n,
int
r,
int
m)
{
if
(r == 0)
return
1;
int
ni = n % m;
int
ri = r % m;
return
(pascal(ni, ri, m) * Lucas(n / m, r / m, m))
% m;
}
public
int
pascal(
int
n,
int
r,
int
m)
{
if
(r == 0 || r == n)
return
1;
int
[] nCr =
new
int
[r + 1];
nCr[0] = 1;
for
(
int
i = 1; i <= n; i++) {
for
(
int
j = Math.Min(r, i); j > 0; j--)
nCr[j] = (nCr[j] + nCr[j - 1]) % m;
}
return
nCr[r];
}
List<
int
> findPrimeFactors(
int
n)
{
List<
int
> primes =
new
List<
int
>();
if
(n % 2 == 0) {
primes.Add(2);
while
(n % 2 == 0)
n >>= 1;
}
for
(
int
i = 3; n > 1; i += 2) {
if
(n % i == 0) {
primes.Add(i);
while
(n % i == 0)
n /= i;
}
}
return
primes;
}
public
static
void
Main(
string
[] args)
{
int
n = 10, r = 2, p = 13;
GFG obj =
new
GFG();
int
ans = obj.nCrModM(n, r, p);
Console.WriteLine(ans);
}
}