Overflow em long

tenho que fazer um trabalho da faculdade que seria, resumindo:

em uma grade de m pontos de altura, por n pontos de largura, quantos retangulos é possível desenhar nestes pontos, no total?

por exemplo, em 2 pontos de altura, por 2 de largura, é possível desenhar 1 retangulo.

em 2 pontos de altura, por 3 de largura, é possível desenhar 3 retangulos.

deu pra entender?

pois bem, o trabalho consiste em saber quantos pontos eu vou precisar para desenhar x retangulos.

achei a seguinte fórmula:

((fatorial de m) / 2 * (fatorial de m menos 2)) * ((fatorial de n) / 2 * (fatorial de n menos 2));

com isto, consigo a quantidade de retangulos, pros pontos dados.

entao, estou fazendo um laço partindo de 1, para, enquanto nao atingir o numero de retangulos desejados, incrementar o m ou n…

porém, lá pelos milhares, dá uma exception, pois o fatorial de x mil estóra o máximo que um long consegue armazenar…

como posso salvar este numero em um long, ou, alguem tem outra soluçao?

grato

Julio Romano

Se o valor é grande demais pra long, então use um BigInteger:

http://java.sun.com/javase/6/docs/api/java/math/BigInteger.html

Ótimo! Funcionou agora!

Muito obrigado!

Agora, não sei se este seria o lugar certo para perguntar isto, mas, alguém saberia uma solução mais otimizada (com o menor número de instruções) para este algoritmo (tenho que tentar fazer da maneira mais otimizada possível) ?

Caso necessário, posto aqui o meu código.

Caso esta pergunta esteja no lugar errado, peço desculpas.

Grato, novamente

Julio Romano

Se sua fórmula realmente é essa (eu me lembro de ter resolvido um problema semelhante em uma olimpíada de matemática e a fórmula parecia bem diferente), você pode lembrar-se que m! = 1.2.3.4. … .(m-1).m, então
m! / (m-2)! = (m-1).m (acho que você deve ter entendido como fazer a conta.
Portanto sua conta seria bem mais simples:
((m-1) * m / 2) * ((n - 1) * n / 2), que não vai estourar um long tão cedo.