Permutação Simples E Com Repetição - Permutação simples e com repetição
Permutação simples e com repetição

Arranjos com letras iguais: quando a fórmula do livro didático deixa de funcionar

Eu estava calculando permutações para um sistema de placas antigas que usava três letras seguidas de três números, e precisei lidar com o fato de que letras podiam se repetir. A placa "AAA111", por exemplo, tinha uma permutação completamente diferente de "ABC123". Foi aí que a diferença entre permutação simples e com repetição deixou de ser teoria e passou a ser algo que precisava aparecer no código.

Permutação simples: o básico que todo mundo esquece

Permutação simples é o número de maneiras de organizar n elementos distintos em uma sequência onde a ordem importa. Se você tem cinco funcionários e precisa designar cinco cargos diferentes, o cálculo é 5! = 120. Não tem como escapar disso. A ordem importa porque colocar João no cargo A e Maria no cargo B gera um resultado diferente de Maria no A e João no B. O erro mais comum que eu vejo é confundir permutação simples com combinação. Em combinação, a ordem não importa. Se você está escolhendo uma comissão de três pessoas de um grupo de dez, isso é C(10,3) = 120. Mas se esses três membros têm cargos diferentes — presidente, tesoureiro, secretário — então vira P(10,3) = 720. A diferença está inteira na pergunta que você faz antes de escolher a fórmula.

Permutação simples e com repetição

Agora, o cenário muda quando elementos se repetem. Você tem n posições para preencher, mas alguns dos elementos disponíveis são idênticos entre si. O caso clássico é rearranjar as letras da palavra "BANANA". São seis letras no total, mas três delas são "A" e duas são "N". Se todas fossem distintas, teríamos 6! = 720 arranjos. Como não são, dividimos pelos fatoriais das repetições: 6! / (3! × 2!) = 720 / 12 = 60 arranjos distintos. A fórmula geral para permutação com repetição é P(n; n1, n2, ..., nk) = n! / (n1! × n2! × ... × nk!), onde n é o total de elementos e n1, n2, etc. são as quantidades de cada elemento que se repete. Se nenhum elemento se repete, todos os ni são 1, o denominador vira 1, e a fórmula se reduz à permutação simples. É a mesma coisa, só mais geral.

Um detalhe que poucas pessoas lembram: se você somar todos os ni, o resultado tem que ser igual a n. Se não for, a fórmula não se aplica diretamente e você precisa revisar o problema antes de continuar.

Quando a fórmula padrão não basta

Em 2019, eu precisei calcular arranjos para senhas de oito caracteres compostas por quatro vogais (duas "A" e duas "E") e quatro consoantes distintas ("B", "C", "D", "F"). Aplicando a fórmula de permutação com repetição, chegaria a 8! / (2! × 2!) = 10.080. Parecia correto até eu perceber que havia uma restrição adicional: as vogais nunca poderiam ficar adjacentes. A fórmula padrão não lida com restrições de posição. O que eu fiz foi usar o método de separação: primeiro arranjar as quatro consoantes (4! = 24), depois inserir as vogais nos espaços entre elas e nas pontas (_ C _ C _ C _ C _), que são cinco espaços disponíveis para quatro vogais. Escolhi quatro desses cinco espaços com C(5,4) = 5, arrangei as vogais dentro desses espaços com 4! / (2! × 2!) = 6, e multipliquei tudo: 24 × 5 × 6 = 720. Muito diferente de 10.080.

👉 Clique no botão abaixo para saber mais sobre o assunto!

A lição prática é: a fórmula de permutação com repetição responde apenas "quantos arranjos distintos existem considerando repetições". Ela não responde nada sobre restrições de posição, adjacência ou outros constraints. Quando essas restrições aparecem, a abordagem correta é construir o problema passo a passo, tratando as restrições como divisões do espaço amostral, não como ajustes na fórmula.

Parmetros que quebram cálculos na prática

Dois problemas recorrentes que eu encontro em produção: Primeiro, fatoriais grandes. 20! já é 2.432.902.008.176.640.000. Em linguagens que usam inteiros de 32 bits, isso transborda na primeira linha. A solução usual é trabalhar com logaritmos para comparar magnitudes sem calcular o fatorial completo, ou usar bibliotecas deBigInt quando a precisão é necessária. Para permutação com repetição, calcular log(n!) - log(n1!) - log(n2!) - ... e depois exponenciar é muito mais seguro do que tentar dividir fatoriais enormes diretamente.

Segundo, elementos que se repetem mas não são perfeitamente contáveis. Eu já vi projetos tentarem usar permutação com repetição quando na verdade alguns elementos são "quase" idênticos — por exemplo, cores que diferem apenas em matiz, ou variantes de um código que mudam em um dígito. A fórmula exige identidade exata. Se dois elementos não são verdadeiramente indistinguíveis, usar permutação com repetição vai superestimar o resultado porque trata itens diferentes como se fossem iguais.

Um exemplo rápido de uso cotidiano

Você tem uma senha de seis dígitos onde os dígitos 1, 2 e 3 aparecem exatamente duas vezes cada. Quantas senhas distintas existem? n = 6, n1 = 2 (para o dígito 1), n2 = 2 (para o dígito 2), n3 = 2 (para o dígito 3). P = 6! / (2! × 2! × 2!) = 720 / 8 = 90. São 90 senhas possíveis com essa configuração exata. Se quiser restringir ainda mais — por exemplo, proibindo que o dígito 1 fique na primeira posição — aí entra a lógica de exclusão, e o número cai para 90 - (5! / (1! × 2! × 2!)) = 90 - 30 = 60.

O ponto é que a permutação com repetição é apenas o primeiro passo. Quase todo problema real no mundo adds uma restrição logo em seguida, e é preciso saber exatamente onde a fórmula pára e onde começa o trabalho adicional.