1103. Integer Factorization (30)

#include "stdafx.h"
#include <iostream>
#include <algorithm>
#include <queue>
#include <string.h>

using namespace std;

vector<int> path, res;
int k, p, flag, maxsum;

int getpow(int n)
{
	int f = n, i;

	for(i = 1; i < p; i++)
	{
		f *= n;
	}

	return f;
}

void dfs(int cur, int curn, int curcount, int cursum)
{
	if(curn == 0 && curcount == k)
	{
		flag = 1;

		if(cursum > maxsum)
		{
			maxsum = cursum;
			res = path;
		}

		return;
	}

	int i, curpow, count;
	for(i = cur; i >= 1; i--)
	{
		curpow = getpow(i);
		count = k - curcount;

		if(curn <= curpow * count && curn >= count)
		{
			path.push_back(i);
			dfs(i, curn - curpow, curcount + 1, cursum + i);
			path.pop_back();
		}
	}
}

int main()
{
	int n;
	scanf("%d%d%d", &n, &k, &p);

	int i;
	for(i = pow(n, 1.0 / p); i >= 1; i--)
	{
		dfs(i, n, 0, 0);
	}

	int size;
	if(flag == 1)
	{
		printf("%d = ", n);

		size = res.size();
		for(i = 0; i < size; i++)
		{
			if(i > 0)
			{
				printf(" + ");
			}

			printf("%d^%d", res[i], p);
		}

		printf("\n");
	}
	else
	{
		printf("Impossible\n");
	}

	system("pause");
	return 0;
}

 

posted on 2025-11-25 09:10  王景迁  阅读(0)  评论(0)    收藏  举报

导航