Formulation
For non-negative integers m and n and a prime p , the following congruence relation holds:
where
and
are the base p expansions of m and n respectively.
#include
<
iostream
>
#include
<
cstdio
>
#include
<
cstring
>
using
namespace
std;
typedef
long
long
llg;
const
int
N
=
150000
;
llg n, m, p, fac[N];
void
init()
{
int
i;
fac[
0
]
=
1
;
for
(i
=
1
; i
<=
p; i
++
)
fac[i]
=
fac[i
-
1
]
*
i
%
p;
}
llg pow(llg a, llg b)
{
llg tmp
=
a
%
p, ans
=
1
;
while
(b)
{
if
(b
&
1
) ans
=
ans
*
tmp
%
p;
tmp
=
tmp
*
tmp
%
p;
b
>>=
1
;
}
return
ans;
}
llg C(llg n, llg m)
{
if
(m
>
n)
return
0
;
return
fac[n]
*
pow(fac[m]
*
fac[n
-
m], p
-
2
)
%
p;
}
llg Lucas(llg n, llg m)
{
if
(m
==
0
)
return
1
;
else
return
(C(n
%
p, m
%
p)
*
Lucas(n
/
p, m
/
p))
%
p;
}
int
main()
{
int
t;
scanf(
"
%d
"
,
&
t);
while
(t
--
)
{
scanf(
"
%I64d%I64d%I64d
"
,
&
n,
&
m,
&
p);
init();
printf(
"
%I64d\n
"
, Lucas(n
+
m, n));
}
return
0
;
}

