Auteur du problème : | Hasan Saleh (MathModel) |
Préparé par : | Hasan Saleh (MathModel) |
Édité par : | Hasan Saleh (MathModel) |
Solution 1 (Analyse Amortie)
Considérons l'algorithme naïf pour le code, qui consiste à itérer tous les entiers (a,b,c,d) avec une borne supérieure telle que b \ge a+1, c \ge b+1, d \ge c+1, et qu'ils ne soient pas tous divisibles par et aient une somme de .
Bien sûr, en théorie, cela est \mathcal{O}(n^4). Pouvons-nous optimiser ? Oui, nous pouvons supprimer , car
Nous avons maintenant un code en \mathcal{O}(n^3), et maintenant ? Il suffit de le soumettre, oui, le code est suffisamment efficace et en fait c'est .
Preuve :
Remarquez que (n \le 10) n'a pas de quad valide, donc imprimez simplement .
Sinon, considérons la première itération de (a,b,c)=(1,2,3), nous ne ferons plus d'itérations tant que (n-a-b-c) \bmod 4 \neq 0 car cela satisfait toutes les conditions, donc pour le cas de (n-(a+b+c)) \bmod 4 \neq 0, cela fait en fait une seule itération, ce qui signifie que pour n \bmod 4 \neq 2, nous ferons une seule itération.
Que se passe-t-il lorsque (n-(a+b+c)) \bmod 4 =0 ? Vous passerez à a=2,b=3,c=5 et vous aurez d=n-10, d \bmod 4=2 ce qui est valide, donc vous ne ferez que itérations (puisque nous avons sauté c=4).
Complexité
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()Complexité
Solution 2 (Cas par Cas) Vous pouvez décider de simplement traiter le code par cas, bien sûr, nous avons cas :
Cas 1 : (1 \le n \le 10) :
Ce cas n'a pas de solutions, donc imprimez simplement .
Lisez la solution de l'analyse amortie pour comprendre le point de traitement par cas ici.
Cas 2 : n \bmod 4 \neq 2
Il y a constructions dont au moins une doit être vraie, il y a
Essayer les cas prendra au maximum 4^2=16 opérations, ce qui est suffisamment rapide.
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()Complexité .