Je pense qu'un petit rappel de théorie mathématiques s'impose...
Une propriété intéressante pour ton problème : k parmi n = (n-k) parmi n
On peut donc envisager de refaire une boucle mais en allant que jusqu'à n/2 puisqu'au delà on se retrouve à refaire les mêmes calculs (inutilement)
Après je ne sais pas en quel langage tu codes, mais l'idéal est d'utiliser des accumulateurs pour ne pas recalculer les factorielles à chaque fois...
Exemple en Pascal (je peux aussi te le faire en C/C++ ou Caml) :
function Recherche(a,n:integer):integer; // renvoie -1 si échec
var k,x,y,z:integer; // x=n! y=k! z=(n-k)!
begin
// cas particuliers
if a<1 then begin
result:= -1;
exit;
end;
if a=1 then begin
result:=0;
exit;
end;
// calcul de n!
x:=1;
for k:=2 to n do
x:=x*k;
// calcul des (k|n)
y:=1;
z:=x;
for k:=1 to (n div 2) do
begin
y:=y*k;
z:=z div k;
if a*y*z=x then begin
result:=k;
exit;
end;
end;
// résultat par défaut
result:= -1;
end;
La confiance n'exclut pas le contrôle