Teorema de Lucas y extendido Lucas (Lucas)

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;
}

Supongo que te gusta

Origin www.cnblogs.com/et3-tsy/p/12499280.html
Recomendado
Clasificación