G题 | 真白的幻觉

解题思路:

暴力枚举每种数字出现的个数。由于 最大取到 ,而 ,因此数字位数最多为

示例代码:

这一部分是题目中 的代码实现。其中可以不使用 unordered_map 缓存结果,也可以使用静态数组缓存(需要额外的边界检查)。

unordered_map<int, int>ump;
int f(int x) {
	if (x == 0) return 0;
	if (ump.count(x)) return ump[x];
	int res = 1;
	while (x) {
		res *= x % 10;
		x /= 10;
	}
	u[x] = res;
	return res;
}

int g(int x) {
	int res = 0;
	while (x != f(x)) x = f(x), ++res;
	return res;
}

这一部分是使用 dfs 枚举所有可能的数量组合,将可能的答案存储在动态数组 ans 中。

int sum, mx;
int cnt[10]; // 每种数字的数量
vector<int>ans;

int build() { // 根据 cnt[] 构建数字
	int num = 0;
	for (int i = 9; i >= 0; --i)
		for (int j = 0; j < cnt[i]; ++j)
			num *= 10, num += i;
	return num;
}

void dfs(int type) {
	if (type == 10) { // 已经遍历完0~9
		int num = build();
		int res = g(num);
		if (res > mx)
			mx = res, ans.clear();
		if (res == mx)
			ans.push_back(num);
		return;
	}

	for (int i = 0; i + sum < 18; ++i) {
		cnt[type] = i;

		sum += i;
		dfs(type + 1);
		sum -= i;
	}
}

void solve() {
	dfs(0);
	cout << mx << endl;
	for (auto&x : ans)cout << x << endl;
}