recuento -------- combinación de vehículo se coloca

Tal placa tiene la siguiente malla, a, b, c, da, b, c, d representan la longitud del borde correspondiente, es decir, el número de la red correspondiente.

Cuando a = b = c = d = 2a = b = c = d = 2, la correspondiente un tablero de ajedrez Tal siguiente:

Para poner kk mutuamente de no atacar el coche en esta placa, esto es una kk coche no hay dos coches en la misma línea, no hay dos coches en la misma columna, se le preguntó cómo muchos tipos de programas.
Sólo es necesario enviar el resultado de la respuesta mod100003mod100003.
Formato de entrada
de línea común, cinco no negativos números enteros a, b, c, d, ka, B, C, D, K.
Los formatos de salida
incluyen un número entero positivo, el resultado después de la mod100003mod100003 respuesta.
Rango de datos
1≤a, b, c, d, k≤10001≤a, b, c, d, k≤1000,

Asegúrese de que haya al menos una opción viable.
Ejemplo de entrada:
22 222

Resultado de muestra:
38

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL;
const int N = 2010, mod = 100003;
int fact[N], infact[N];
int qmi(int a, int k){
 int res = 1;
 while(k){
  if (k & 1)  res = res * a % mod;
  a = a * a % mod;
  k >>= 1;
 }
 return res;
}
int C(int a, int b){
 if (a < b)   return 0;
 return (LL)fact[a] * infact[a - b] * infact[b] % mod;
}
int P(int a, int b){
 if (a < b)   return 0;
 return (LL)fact[a] * infact[a - b] % mod;
}
int main(){
 fact[0] = infact[0] = 1;
 for (int i = 1; i < N ;i ++){
  fact[i] = (LL)fact[i - 1] * i % mod;
  infact[i] = (LL)infact[i - 1] * qmi(i, mod - 2) % mod;
 }
  int a, b, c, d, k;
 cin >> a >> b >> c >> d >> k;
  int res = 0;
 for (int i = 0; i <= k; i ++){
  res = (res + (LL)C(b, i) * P(a, i) % mod * C(d, k - i) * P(a + c - i, k - i)) % mod;
 }
  cout << res << endl;
  return 0;
}
Publicados 106 artículos originales · ganado elogios 67 · vistas 5404

Supongo que te gusta

Origin blog.csdn.net/qq_45772483/article/details/105079876
Recomendado
Clasificación