Autor del problema: | Hasan Saleh (MathModel) |
Preparado por: | Hasan Saleh (MathModel) |
Editado por: | Hasan Saleh (MathModel) |
Solución 1 (Análisis Amortizado)
Consideremos un algoritmo ingenuo para el código, que consiste en iterar todos los enteros (a,b,c,d) con un límite superior tal que b \ge a+1, c \ge b+1, d \ge c+1, y que no sean divisibles por y tengan una suma de .
Por supuesto, en teoría esto es \mathcal{O}(n^4). ¿Podemos optimizar? Sí, podemos eliminar , porque
Ahora tenemos un código de \mathcal{O}(n^3). ¿Y ahora qué? Solo envíalo, sí, el código es lo suficientemente eficiente y de hecho es .
Prueba:
Observa que (n \le 10) no tiene cuádruples válidos, así que solo imprime .
De lo contrario, considera la primera iteración de (a,b,c)=(1,2,3), no haremos más iteraciones mientras (n-a-b-c) \bmod 4 \neq 0 porque satisface todas las condiciones, así que para el caso de (n-(a+b+c)) \bmod 4 \neq 0 en realidad hacemos una sola iteración, lo que significa que para n \bmod 4 \neq 2 haremos una sola iteración.
¿Qué pasa cuando (n-(a+b+c)) \bmod 4 =0? Te moverás a a=2,b=3,c=5 y tendrás d=n-10, d \bmod 4=2 lo cual es válido, así que solo harás iteraciones (ya que omitimos c=4).
Complejidad
def solve():
n=int(input())
if(n<=10):
print(-1)
else:
for a in range(1,n):
for b in range(a+1,n):
for c in range(b+1,n):
if(len(set([a,b,c,n-(a+b+c)]))==4 and a%4!=0 and b%4!=0 and c%4!=0 and (n-(a+b+c))%4!=0 and n-a-b-c>0):
print(a,b,c,n-a-b-c)
return
for _ in range(int(input())):
solve()Complejidad
Solución 2 (Trabajo por Casos) Puedes decidir simplemente trabajar por casos en el código, claro, tenemos casos:
Caso 1: (1 \le n \le 10):
Este caso no tiene soluciones, así que solo imprime .
Lee la Solución del Análisis Amortizado para entender el punto de trabajar por casos aquí.
Caso 2: n \bmod 4 \neq 2
Hay construcciones que al menos una de ellas debe cumplirse, hay
Probar los casos tomará como máximo 4^2=16 operaciones, lo cual es lo suficientemente rápido.
def solve():
n=int(input())
a=[1,2,3,n-6]
b=[2,3,5,n-10]
c=[1,2,5,n-8]
d=[1,2,6,n-9]
v=[a,b,c,d]
for i in v:
if(min(i)>0 and len(set(i))==4 and i[3]%4!=0):
print(*i)
return
print(-1)
for _ in range(int(input())):
solve()Complejidad .