Pregunta B: Contar ----------------------------- Pensamiento (Matemática combinada)

Título Descripción
Alice y Bob juegan al ajedrez en un sistema de coordenadas rectangular. El peón de Alice está inicialmente en la posición (0,0) y debe ir a la posición (a, b); el peón de Bob está inicialmente en la posición (c, 0) y tiene que ir a la posición (a, d). Las piezas solo pueden moverse varias unidades de longitud a lo largo de la dirección positiva del eje x o del eje y, y pregunte cuántos esquemas de movimiento hacen que las trayectorias de movimiento de las dos piezas no se crucen.
Entrada
Ingrese una fila de 4 enteros positivos, en orden a, b, c, d.
Salida
El resultado del módulo el número total de esquemas contra el número primo 100000007.
Entrada de muestra Copia
3 2 1 1
Salida de muestra Copia
6
Aviso
[Explicación de muestra] Cuando
A camina (0,0) → (0,2) → (3,2), B tiene 3 formas de ir:
(1, 0) → (1,1) → (3,1)
(1,0) → (2,0) → (2,1) → (3,1)
(1,0) → (3,0) → ( 3,1) Cuando
A camina (0,0) → (0,1) → (1,1) → (1,2) → (3,2), B tiene 2 formas de caminar.
Cuando A camina (0,0) → (0,1) → (2,1) → (2,2) → (3,2), B tiene 1 forma de caminar.

[Rango de datos]
Para el 50% de los datos, a + b <= 20.
Para el 70% de los datos, a + b <= 2e4.
Para el 100% de los datos, a + b <= 2e5 y a> c, b> d.

Análisis: de acuerdo con el
significado de la pregunta: A debe estar encima de B (un avance muy importante, enumerando el número de esquemas del eje x).
Por lo tanto, el número de combinaciones de A a (a, b) C (a + b, a) En el paso, elija a para tomar el eje x

Entonces, ¿por qué la combinación número C (a-c + d, ac) de B a (a, d) se reduce por c, porque encontramos que son disjuntos y A está por encima de B, entonces las líneas por encima de B son No puedo ir, así que resta.

Combinado, C (a + b, a) * C (a-c + d, ac)
se repetirá.
La situación repetida es que AB va al punto final e intercambia entre sí.
Luego, el número de combinaciones de punto final de A a B es C (a + d, a);
luego, el número de combinaciones de punto final de B a A es C (a-c + b, ac) ;

Entonces la respuesta final es: C (a + b, a) * C (a-c + d, ac) -C (a + d, a) * C (a-c + b, ac)

Inserte la descripción de la imagen aquí

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+10;
const int MOD=100000007;
ll fact[N];
int a,b,c,d;
void init()
{
	fact[1]=1;
	for(int i=2;i<=N;i++)
	{
		fact[i]=(fact[i-1]*i)%MOD;
	}
}
ll quick(ll a,ll b)
{
	ll res=1;
	while(b)
	{
		if(b&1) res=res*a%MOD;
		a=a*a%MOD;
		b>>=1; 
	 } 
	 return res;
}
int main()
{
	init();
	scanf("%d %d %d %d",&a,&b,&c,&d);
	ll res1=(fact[a+b]%MOD*quick(fact[a],MOD-2)%MOD*quick(fact[a+b-a],MOD-2)%MOD*fact[a-c+d]%MOD*quick(fact[a-c],MOD-2)%MOD*quick(fact[a-c+d-a+c],MOD-2)%MOD);
	ll res2=(fact[a+d]%MOD*quick(fact[a],MOD-2)%MOD*quick(fact[a+d-a],MOD-2)%MOD*fact[a-c+b]%MOD*quick(fact[a-c],MOD-2)%MOD*quick(fact[a-c+b-a+c],MOD-2)%MOD);
	ll sum=(res1-res2+MOD)%MOD;
	cout<<sum<<endl;
}
572 artículos originales publicados · elogiados 14 · 10,000+ vistas

Supongo que te gusta

Origin blog.csdn.net/qq_43690454/article/details/105211842
Recomendado
Clasificación