10 líneas de código AC-UVA 11538-Chess Queen (ley matemática + secuencia, con explicación detallada)

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 Inserte la descripción de la imagen aquí
hay dos direcciones diagonales, se multiplica por 2, para obtener la siguiente fórmula: Inserte la descripción de la imagen aquí
ParaInserte la descripción de la imagen aquí

Porque: los 1^2+2^2+3^2...+n^2primeros 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

paraInserte la descripción de la imagen aquí

Tener:Sn=n(a1+an)/2

luego:
Inserte la descripción de la imagen aquí


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!

Supongo que te gusta

Origin blog.csdn.net/weixin_43899069/article/details/108090293
Recomendado
Clasificación