Eu precisei de auxílio computacional para resolver a questão.

Os passos foram:

1) Para cada opção de perímetro veja todas as áreas possíveis
2) Para cada área veja todos os perímetros possíveis
"Lúcio diz: Eu sabia que você não saberia as medidas dos lados da fazenda."
3) A frase acima implica que Lúcio possui um perímetro em que, entre todas
as áreas possíveis daquele perímetro, nenhuma delas possui esse perímetro
como único possível. Esses são os perímetros válidos até o momento e as
áreas válidas até o momento são só aqueles que podem ser geradas por esses
perímetros.
"Patza diz: Agora eu sei as medidas dos lados da fazenda. "
4) A frase acima implica que as áreas válidas serão somente aquelas que
possuírem somente um dos perímetros acima válidos.
"Lúcio diz: Agora eu também sei as medidas dos lados da fazenda."
5) A frase acima implica que dada as áreas válidas, os perímetros válidos
são só aqueles que possuem apenas uma área que satisfaça 4.

5 retorna apenas um perímetro: 34,
Correspondente a área 52

Agora basta fazer:
2*a + 2*b = 34
a*b = 52

a = 17 - b

17b -b^2 = 52
b^2 -17n + 52 = 0
b = (17 +- 9)/2
b = 4 ou b = 13
a = 13 ou a = 4

Ou seja, o menor lado é 4 e o maior é 13.

Vou anexar o pograma em C++, porém ele não está nada comentado ou didático.
Qualquer coisa pode me perguntar.

2010/6/23 arkon <ar...@bol.com.br>

>  Dois matemáticos, Patza e Lúcio, profundos conhecedores de lógica e
> extremamente rápidos em fazer cálculos mentais, encontram-se na fazenda de
> um terceiro matemático chamado Hermes.
> Este, para se divertir, diz que sua fazenda tem formato retangular, com
> lados medindo um número inteiro de quilômetros de 2 a 62.
> Ele dá um papel para Patza onde está escrita a área da fazenda em
> quilômetros quadrados e outro para Lúcio, com o perímetro da fazenda em
> quilômetros.
> Segue-se então, o divertido diálogo entre eles:
> Patza diz: Eu não sei as medidas dos lados da fazenda.
> Lúcio diz: Eu sabia que você não saberia as medidas dos lados da fazenda.
> Patza diz: Agora eu sei as medidas dos lados da fazenda.
> Lúcio diz: Agora eu também sei as medidas dos lados da fazenda.
>
> Supondo que ambos falaram a verdade, quais as medidas dos lados da fazenda?
> =========================================================================
> Instru�ões para entrar na lista, sair da lista e usar a lista em
> http://www.mat.puc-rio.br/~obmlistas/obm-l.html<http://www.mat.puc-rio.br/%7Eobmlistas/obm-l.html>=========================================================================
#include <iostream>
#include <set>
#include <map>
#include <algorithm>

using namespace std;

#define ITE(v) typeof(v.begin())
#define FOR(i,n) for(int i = 0; i < n; i++)
#define FORIT(it,v) for(ITE(v) it = v.begin(); it != v.end(); it++)

map<int,set<int> > p2a;
map<int,set<int> > a2p;
set<int> gooda;
set<int> goodp;
set<int> gooda2;
set<int> goodp2;

int main() {
  for (int i = 2; i <= 62; i++) {
    for (int j = i; j <= 62; j++) {
      int per = 2*i + 2*j;
      int area = i*j;
      p2a[per].insert(area);
      a2p[area].insert(per);
    }
  }
  FORIT(it,p2a) {
    set<int> &v = it->second;
    bool ok = true;
    FORIT(jt,v) {
      if (a2p[*jt].size() == 1) {
        ok = false;
        break;
      }
    }
    if (!ok) continue;
    goodp.insert(it->first);
    cout << it->first << ":";
    FORIT(jt,v) {
      cout << " " << *jt << "(" << a2p[*jt].size() << ")";
      gooda.insert(*jt);
    }
    cout << endl;
  }
  cout << endl << endl;

  FORIT(it,a2p) {
    if (!gooda.count(it->first)) continue;
    set<int> &v = it->second;
    int ok = 0;
    FORIT(jt,v) {
      if (goodp.count(*jt)) {
        ok++;
      }
    }
    if (ok != 1) continue;
    gooda2.insert(it->first);
    cout << it->first << ":";
    FORIT(jt,v) {
      if (goodp.count(*jt)) {
        cout << " " << *jt << "(" << p2a[*jt].size() << ")";
        goodp2.insert(*jt);
      }
    }
    cout << endl;
  }

  cout << endl << endl;
  FORIT(it,p2a) {
    if (!goodp2.count(it->first)) continue;
    set<int> &v = it->second;
    int ok = 0;
    FORIT(jt,v) {
      if (gooda2.count(*jt)) {
        ok++;
      }
    }
    if (ok != 1) continue;
    cout << it->first << ":";
    FORIT(jt,v) {
      if (gooda2.count(*jt)) {
        cout << " " << *jt << "(" << a2p[*jt].size() << ")";
      }
    }
    cout << endl;
  }

  return 0;
}

Responder a