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