Fatoração K-P de Inteiros Positivos

A fatoração K−P de um inteiro positivo N consiset em experssar N como a soma das P-ésimas potências de K inteiros positivos. O objetivo é desenvolver um programa que determine tal fatoração para quaisquer N, K e P positivos.

Especificação de Entrada:

Cada caso de teste é fornecido em uma única linha contendo três inteiros positivos: N (≤400), K (≤N) e P (1<P≤7). Os valores são separados por espaço.

Especificação de Saída:

Quando existir uma solução, a saída deve seguir o formato:

N = n[1]^P + ... + n[K]^P

onde n[i] (para i = 1, ..., K) representa o i-ésimo fator. Os fatores devem ser listados em ordem não crescente.

Observação: a solução pode não ser única. Por exemplo, a fatoração 5-2 de 169 possui nove soluções, como 12^2+4^2+2^2+2^2+1^2 ou 11^2+6^2+2^2+2^2+2^2, entre outras. A saída deve corresponder à solução com a maior soma dos fatores. Em caso de empate, escolhe-se a sequência lexicograficamente maior — uma sequência { a1, a2, ..., aK } é considerada maior que { b1, b2, ..., bK } se existir um L (1≤L≤K) tal que ai = bi para i<L e aL > bL.

Se não houver solução, a saída deve ser simplesmente "Impossible".

Exemplo de Entrada 1:

169 5 2

Exemplo de Saída 1:

169 = 6^2 + 6^2 + 6^2 + 6^2 + 5^2

Exemplo de Entrada 2:

169 167 3

Exemplo de Saída 2:

Impossible

A seguir, apresenta-se uma implementação em C++ que utiliza recursão para explorar todas as combinações possíveis. O código foi reestruturado com nomes de variáveis e lógica modificados, mantendo a correção do algoritmo original.


#include <iostream>
#include <cmath>
#include <vector>
#include <algorithm>
using namespace std;

void buscarFatoracao(int limite, int k_atual, int soma_pot, int soma_bases, 
                     int n, int k, int p, const vector<int>& potencias,
                     vector<int>& seq_corrente, vector<int>& seq_melhor, 
                     int& soma_maxima) {
    if (soma_pot == n && k_atual == k) {
        if (soma_bases > soma_maxima) {
            soma_maxima = soma_bases;
            seq_melhor = seq_corrente;
        }
        return;
    }
    
    if (soma_pot > n || k_atual > k || limite < 1) {
        return;
    }
    
    seq_corrente.push_back(limite);
    buscarFatoracao(limite, k_atual + 1, soma_pot + potencias[limite], 
                    soma_bases + limite, n, k, p, potencias, 
                    seq_corrente, seq_melhor, soma_maxima);
    seq_corrente.pop_back();
    
    buscarFatoracao(limite - 1, k_atual, soma_pot, soma_bases, n, k, p, 
                    potencias, seq_corrente, seq_melhor, soma_maxima);
}

int main() {
    int n, k, p;
    cin >> n >> k >> p;
    
    vector<int> potencias;
    int max_base = 0;
    while (pow(max_base, p) <= n) {
        potencias.push_back(pow(max_base, p));
        max_base++;
    }
    
    vector<int> seq_corrente;
    vector<int> seq_melhor;
    int soma_maxima = -1;
    
    buscarFatoracao(max_base - 1, 0, 0, 0, n, k, p, potencias, 
                    seq_corrente, seq_melhor, soma_maxima);
    
    if (soma_maxima == -1) {
        cout << "Impossible" << endl;
    } else {
        cout << n << " = ";
        for (size_t i = 0; i < seq_melhor.size(); ++i) {
            if (i > 0) cout << " + ";
            cout << seq_melhor[i] << "^" << p;
        }
        cout << endl;
    }
    
    return 0;
}

Tags: C++ recursion integer factorization Algorithm power sum

Publicado em 6-15 22:50 por Thomas