Bonjour,
je bloque sur un exercice des olympiades internationales de mathématiques 1995 (j'ai pris la liberté de mettre le sujet dans "supérieur" même si théoriquement on peut le résoudre avec les outils de terminale)
Voici l'énoncé :
Soit p un nombre premier impair. Trouver le nombre de sous-ensembles A de l'ensemble {1, 2, ., 2p} tels que :
a) A contient exactement p éléments ;
b) la somme de tous les éléments de A est divisible par p.
Quelques pistes de réflexion :
-Il est peut être plus facile de travailler en écrivant les nombres de {1,...,2p} sous la forme
p + k avec k appartenant à {-(p-1),...,p} : cela permet de voir directement que le nombre en question est congru à k modulo p, et éventuellement de l'annuler avec son complémentaire...
-Il me semble que si un p-uplet est solution, son "symétrique par rapport à p" l'est aussi puisqu'on change les p-k en p+k, et en regroupant les k dans la somme finale on obtient toujours 0 ...
-Si un p-uplet est solution, si on ajoute ou on soutrait un nombre à tous les éléments, le p-uplet obtenu est toujours solution puisque ca ne fait que rajouter ou enlever un multiple de p dans la somme finale.
-Il est peut-être judicieux de calculer séparément les nombres de solutions d'une largeur donnée ,en définissant la largeur comme (le nombre le plus grand de la solution - le nombre le plus petit + 1), d'ailleurs si on regarde un sous-ensemble de largeur p (la largeur minimale), il est toujours solution : en effet on voit que {1,2,...,p} est solution (la somme est p + (p-1) + ... + 2 + 1 qui s'écrit aussi p + (p-1) + 1 + (p-2) + 2 + ... qui est bien multiple de p) et un ensemble de largeur p est forcément égal à {1,2,...,p} + constante ( on ajoute la constante à chaque élément), ce qui fournit déjà p + 1 solutions...
- Si vous voulez savoir de manière plus générale combien il y a de sous ensembles de taille b et dont la somme des composants est multiple de b d'une liste {1,...,a}, j'ai codé très vite fait quelques lignes de caml pour ca :
let rec distrib a listedelistes = match listedelistes with
|[] -> []
|h::t -> (a::h)::(distrib a t);;
let rec parmi nombre liste =
if nombre = list_length liste then [liste]
else
match liste with
|[] -> []
|_ ->(parmi nombre (tl liste))@(distrib (hd liste) (parmi (nombre-1) (tl liste)));;
let rec sommateur liste = match liste with
|[] -> 0
|a::b -> a + sommateur b;;
let compteur nombre liste =
let listedesommes = map sommateur (parmi nombre liste) in
let vecteurdesommes = vect_of_list listedesommes in
let compteur = ref 0 in
for i = 0 to (vect_length vecteurdesommes) - 1 do
if vecteurdesommes.(i) mod nombre = 0 then incr compteur;
done;
(!compteur);;
let compteur2 nombre nombredelaliste =
let listeformee = ref [] in
for i = 1 to nombredelaliste do
listeformee := i::(!listeformee);
done;
compteur nombre (!listeformee);;
Tapez simplement compteur2 b a;; ...
