1103 Integer Factorization


idea

题意为对于正整数n分解为k个p次方的形式,若无,则输出impossible;若有,则输出底数和最大的方案,还有多种方案时则输出字典序最大(数值最大)的方案。

首先预处理所有p次方不大于n的值;

再用深搜枚举选择(可多次)或不选择当前底数的方案,当当前选择的底数个数nowK大于k或当前所选数的p次方nowSum大于n时停止,当nowK==k且nowSum= =n时找到一种方案,判断是否需要更新已有方案

solution

cpp 复制代码
#include<iostream>
#include<cmath>
#include<vector>
using namespace std;

int n, k, p, sum = 0;
vector<int> fac, ans, temp;

void dfs(int index, int nowK, int nowSum, int facSum){
	if(nowK == k && nowSum == n){//找到一种符合条件的组合 
		if(facSum > sum){//底数和更大则更新 
			sum = facSum;
			ans = temp;
		}
		return; 
	}
	if(nowK > k || nowSum > n) return;//不符合限制,剪掉
	if(index > 0){//满足正整数,不需要考虑0 
		temp.push_back(index);
		dfs(index, nowK + 1, nowSum + fac[index], facSum + index);//选择加入
		temp.pop_back();//不加入则把上次选择加入时压入的index弹出 
		dfs(index - 1, nowK, nowSum, facSum);//选择不加入,考虑下一个底数 
	} 
}
int main(){
	scanf("%d%d%d", &n, &k, &p);
	for(int i = 1, t = 0; t <= n; i++){//初始化p次方小于等于n的记录表 
		fac.push_back(t);
		t = pow(i, p);
	} 
	dfs(fac.size() - 1, 0, 0, 0);//倒着找,以字典序更大的为先
	if(!sum) printf("Impossible");
	else{
		printf("%d = %d^%d", n, ans[0], p);
		for(int i = 1; i < ans.size(); i++)
			printf(" + %d^%d", ans[i], p);
	}
	return 0;
}
相关推荐
青 春 记 忆3 小时前
LeetCode 21. 合并两个有序链表|Python 解法详解
python·算法·leetcode·链表
Sagittarius_A*5 小时前
后量子密码|通识认知 03|量子威胁辟谣:Grover 算法对对称密码的影响与误区
算法·信息安全·密码学·量子计算·pqc·后量子密码
QAQo7T7 小时前
Python组蓝桥杯备赛超详细知识点总结笔记_排序算法篇
笔记·python·算法·蓝桥杯·排序算法
千里之行,始于足下sanhai7 小时前
P8686 [蓝桥杯 2019 省 A] 修改数组 - 数字魔法大冒险 题解
c++·算法·动态规划
小星星闪亮登场7 小时前
Codeforces Round 1115 ( Div. 2)
数据结构·c++·算法·贪心算法·排序算法·codeforces
计算机小白一个7 小时前
蓝桥杯 Java B 组之哈希表应用(两数之和、重复元素判断)
java·数据结构·算法·蓝桥杯
Loge编程生活7 小时前
打卡信奥刷题(3449)用C++实现信奥题 P10429 [蓝桥杯 2024 省 B] 拔河
开发语言·数据结构·c++·算法·青少年编程
2601_957174658 小时前
大模型算法 简单 容易 用这个方法
算法
VALENIAN瓦伦尼安教学设备8 小时前
激光对中仪采购要点
数据库·嵌入式硬件·算法
Forever Nore10 小时前
LeetCode 1 两数之和
算法·leetcode·职场和发展