Sistema de seguridad (triángulo Yang Hui para encontrar el número de combinación)

Portal de títulos

El título es
para darte n cajas. Puedes poner 0 o 1 en cada caja, puedes poner solo una, puedes poner todas, no puedes poner ninguna, ahora hay 1, b 0, cada 1 o cada 0 No es lo mismo, pregunta cuántas opciones tienes para poner.

Rango de datos
a, b≤50, n + a \ le 50n + a≤50, n + b \ le 50n + b≤50

Idea
Tenga en cuenta que cada 1 (o 0) es diferente, esto me atrapó durante mucho tiempo. Este problema es fácil de pensar en la solución de las matemáticas combinatorias. Debido a que no se afectan entre sí, podemos poner 1 primero y luego 0. Para poner 1, podemos elegir i 1 de un 1 y luego elegir 1 de n posiciones para poner 1, que es equivalente a C n i * C a i , lo mismo es cierto para 0. Finalmente, multiplique el número de soluciones puestas por 1 y el número de soluciones puestas por 0.

Pero si usamos factorial para calcular el número combinado de acuerdo con la fórmula, la precisión se explotará, por lo que tenemos que encontrar otra forma.
Escribí una pregunta sobre el triángulo de Yang Hui para encontrar el número de combinación antes, que se puede usar aquí. Abrir datos de la ULL .

#include<bits/stdc++.h>
using namespace std;
const int N=1e3+5;
const int inf=0x7fffffff;
const int mod=1e9+7;
const int eps=1e-6;
typedef long long ll;
typedef unsigned long long ull;
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define pii pair<int,int>
#define int long long
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define endl '\n'
ull c[N][N];
void zuhe()
{
    c[0][0]=1;
    for(int i=1;i<=55;i++)
    {
        for(int j=0;j<=i;j++)
        {
            c[i][j]=c[i-1][j];
            if(j!=0)
                c[i][j]+=c[i-1][j-1];
        }
    }
}
signed main()
{
    IOS;
    int n,a,b;
    cin>>n>>a>>b;
    zuhe();
    ull res=0;
    ull tt=0;
    for(int i=0;i<=min(a,n);i++)
    {
        tt+=c[n][i]*c[a][i];
    }
    res=tt;tt=0;
    for(int i=0;i<=min(b,n);i++)
    {
        tt+=c[n][i]*c[b][i];
    }
    res*=tt;
    cout<<res<<endl;
}

Publicado 93 artículos originales · ganado elogios 9 · vistas 4203

Supongo que te gusta

Origin blog.csdn.net/Joker_He/article/details/104851838
Recomendado
Clasificación