Inspirador: use la menor cantidad de código posible para expresarse de manera eficiente
Enviar enlace (tema) ——> UVA-11538
Tema
Encuentra el número de escenarios donde se colocan 2 reinas diferentes en el tablero de ajedrez n * m y se atacan entre sí, es decir, encuentra todas las situaciones en las que 2 reinas diferentes están en la misma fila, la misma columna o la misma diagonal.
Viaje mental
¡Vea que el rango de valores de myn y el valor de salida de la muestra son demasiado grandes! Primero asegúrese de que este sea un problema regular. Y utilice un almacenamiento prolongado.
Primero encuentre las reglas, y después de encontrar las reglas, golpee la mesa o presione la fórmula matemática.
Esta pregunta puede adoptar la idea de dividir y conquistar, y considerar los tipos de ataques de reina en tres partes: ataque de pares, ataque de la misma fila y ataque de la misma diagonal. Las últimas tres partes se suman.
Ataque entre pares: la reina A tiene n caminos en cada fila, un total de m filas. Pero la reina B solo tiene n-1 formas de ponerlo en una fila. Multiplica para obtener n*m*(m-1)
.
Ataque en la misma línea: Igual que el anterior, y finalmente:m*n*(n-1)
Con diagonal: N≤M establecido, todas las diagonales / direcciones, una longitud del orden de izquierda a derecha
hay dos direcciones diagonales, se multiplica por 2, para obtener la siguiente fórmula:
Para
Porque: los 1^2+2^2+3^2...+n^2
primeros n elementos y Sn=n(n+1)(2n+1)/6
por lo tanto tienen:S(n-1)=Sn-n=n(2n-1)(n-1)/6
para
Tener:Sn=n(a1+an)/2
luego:
Visualización de código:
#include<bits/stdc++.h>
using namespace std;
int main() {
long long m, n; while(cin>>m>>n && m) {
long long sum = 0;
if(n > m) swap(m,n);
sum = m*n*(n-1) + n*m*(m-1) + (2*n*(n-1)*(3*m-n-1))/3;
cout << sum << endl;
}
return 0; }
Si este artículo te ha ayudado, ¡dale un pequeño me gusta al blogger! ¡Los gustos de todos son la mayor motivación para mi creación!