Le compte est bon ! TM

"Le compte est bon" est un jeu très populaire dont le principe est simple : on donne des valeurs entières, et il faut trouver une formule mathématique utilisant une fois au plus chacune de ces valeurs, et dont le résultat soit égal à un nombre donné.

Plus précisément, on donne 6 nombres entiers, appelées les "plaques", choisis dans l'ensemble { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 25, 50, 75, 100 }. On se demande alors s'il est possible d'obtenir une valeur donnée entre 0 et 999 en combinant les valeurs de départ à l'aide des quatre opérateurs élémentaires, qui sont l'addition, la soustraction (lorsqu'elle donne un résultat positif), la multiplication, et la division entière (lorsqu'elle tombe juste). Les valeurs de départ ne peuvent être utilisées qu'une seule fois au plus chacune. On doit toujours utiliser au moins une plaque, y compris si la valeur à atteindre vaut 0.

Par exemple, avec les plaques 4, 9, 8, 2, 8, et 75, on peut obtenir le nombre 309 de la manière suivante :

309 = 4 * (75 + 2) + (8 / 8)
Notez que la plaque 9 n'a pas été utilisée, et que chacune des deux plaques 8 a été utilisée une fois. Notez que l'on n'a pas le droit de faire des opérations comme 9 / 2, ni 2 / 4, ni 2 - 4.

Le but de ce sujet est de déterminer le nombre de valeurs différentes qu'il est possible d'obtenir à partir d'un ensemble fixé de plaques.

Limites de temps et de mémoire (Python)

  • Temps : 1 s sur une machine à 1 GHz.
  • Mémoire : 32 000 ko.

Contraintes

  • 1 <= N <= 6, où N est le nombre de plaques.
  • Vi dans l'ensemble { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 25, 50, 75, 100 }, où Vi est la valeur d'une plaque.

Certains fichiers tests seront faciles à résoudre. Sur les 12 fichiers tests, il y aura 2 fichiers tests pour chaque nombre de plaques de 2 à 5, et 4 fichiers tests avec 6 plaques.

Entrée

  • La première ligne de l'entrée contient un entier N : le nombre de plaques.
  • La seconde ligne de l'entrée contient N entiers séparés par des espaces : les valeurs des plaques.

Sortie

Affichez un entier : le nombre de valeurs différentes que l'on peut atteindre entre 0 et 999 inclus.

Exemple

entrée :

3
1 3 5

sortie :

16

Commentaires

En effet, on peut atteindre les nombres suivants. Pour chacun, on indique une manière de l'obtenir (il y en a parfois plusieurs) :

11
23 - 1
33
45 - 1
55 / 1
65 + 1
75 + 3 - 1
85 + 3
95 + 3 + 1
10(3 - 1) * 5
12(5 - 1) * 3
145 * 3 - 1
155 * 3
165 * 3 + 1
18(5 + 1) * 3
20(3 + 1) * 5

Voici un autre exemple :

6
4 9 8 2 8 75
pour lequel le résultat est 997 : ces plaques permettent d'atteindre tous les nombres de 0 à 999 sauf 3, à savoir 772, 942 et 966.

Squelette de code C++ :

#include <cstdio>
#include <cstdlib>
const int MAX_PLAQUES = 6;

int nbPlaques;
int plaques[MAX_PLAQUES];

int main()
{
   scanf("%d", &nbPlaques);
   for (int plaque = 0; plaque < nbPlaques; plaque++)
      scanf("%d", &plaques[plaque]);
   
   int nbPossibles = ...;
   printf("%d\n", nbPossibles);
   return 0;
}
Squelette de code Caml :
open Printf
let scan_int () = Scanf.scanf " %d" (fun x -> x)

let nb_plaques = scan_int()
let plaques = Array.init nb_plaques (fun _ -> scan_int())

let _ =
   let nbPossibles = ... in
   printf "%d\n" nbPossibles

Source : http://www.france-ioi.org/ Créé par : Arthur Charguéraud.