Teorema ampliar Lucas y Lucas
Algunos datos de:
1.https: //blog.csdn.net/qq_40679299/article/details/80489761
2.https: //www.luogu.com.cn/problemnew/solution/P3807
En este artículo, permutaciones C (n, m) representa, en el n-ésimo de m, el orden no lo hace
Frente ~ Queso:
1) inverso multiplicativo
Si ax≡1 (mod p), y gcd (a, p) = 1 (un primer y p), llamado el inverso multiplicativo de un módulo p para el elemento x
2) Fermat es pequeño teorema:
^ A (. 1-p) ≡1 (mod p) (en la que p y un primer)
3) extendido euclidiana
números enteros conocidos a, b, extendido euclidiana Algoritmo se pueden obtener por una, mientras que b es el máximo común divisor, para encontrar un número entero x, y (uno de los cuales es probable que sea negativo), de modo que satisfagan la ecuación ax Bezu + by = gcd (a, b)
Inversión de yuanes general del Pequeño teorema de Fermat se puede utilizar o ampliar euclidiana lograr.
Teorema de Lucas
Por lo que ahora presentado oficialmente Lucas teorema.
alcance
Pregunta C (n, m)% mod, mod generalmente es un número primo, n, m, es relativamente grande, y es claramente mayor que si n, m, y que no hay necesidad de escribir Lucas, Inversing suficiente luz mod
Tal como N tomar los siguientes valores H, p es Lucas relativamente bien adaptadas
40118 16827 2521
18506 3902 883
La idea central
Queremos calcular C (n, m) en el que la combinación matemática de datos a menudo es relativamente grande cuando la necesidad de una operación de módulo.
Puesto que la división calculada no contiene directamente módulo, de lo contrario habrá problemas como la siguiente:
Por ejemplo, usted es 3 * 5 * 7/5% de 4
Si se calcula correctamente la respuesta es 1, y si primero se calcula el 15, en un módulo 3, luego contar 21, como módulo 1, entonces no hay ninguna adición a 5, cómo hacerlo?
Obviamente, este proceso pasa por alto el problema de que la eliminación de la parte delantera y no k * 4/5 tratados, y esta parte una vez / 5, puede que no divisible por 4
Y Lucas Teorema Basado en esto, la división a través del elemento inversa, ser convertida en una multiplicación , una operación de módulo que no produce las consecuencias anteriormente descritos
F / A === preguntar cantidad (mod C)
Si hay A * X === 1 (mod C)
Luego multiplicar los dos lados al mismo tiempo, para dar el F * X === para la cantidad (mod C)
condiciones establecidas
(1) Modo de ecuaciones de A * X === presencia 1 (mod C) solución de
(2) A | F (F% A == 0)
Tal división hábilmente convirtió en una multiplicación
teorema Descripción
Feng Zhigang "teoría de números elemental" y la versión de prueba:
Luo pesos pesados prueban Valley
Lucas extendida Teorema
Luo Gu P3807
#include<iostream>
#include<cstring>
using namespace std;
typedef long long int LL;
LL p;
LL min(LL a,LL b)
{
return a<b?a:b;
}
LL up(LL k,LL num)
{
LL awsl=1;
while(k)
{
if(k&1)awsl=(awsl*num)%p;
k/=2;
num=(num*num)%p;
}
return awsl%p;
}
LL getx(LL a)
{
if(a==1)return 1;
return up(p-2,a);
}
LL c(LL m,LL n)
{
if(m<n)return 0;
n=min(n,m-n);
LL ans=1;
for(int i=1;i<=n;i++)
{
ans=ans*(m+1-i)%p*getx(i)%p;
}
return ans;
}
LL Lucas(LL m,LL n)
{
LL ans=1;
LL cur=1;
while(cur<=m||cur<=n)cur*=p;
while(cur)
{
ans*=c(m/cur,n/cur);
m=m%cur;
n=n%cur;
cur/=p;
}
return ans%p;
}
void solve()
{
LL n,m;
cin>>n>>m>>p;
cout<<Lucas(m+n,n)<<endl;
}
int main()
{
int t;
cin>>t;
for(int i=0;i<t;i++)
{
solve();
}
return 0;
}