测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A40830. 数字划分

填空题 困难

题目描述

数字划分

题目描述

w星球的长老交给小明一个任务:

1, 2, 3… 16 这16个数字分为两组。

要求:

1、这两组数字的和相同,

2、并且,两组数字的平方和也相同,

3、并且,两组数字的立方和也相同。

请你利用计算机的强大搜索能力解决这个问题。

并提交1所在的那个分组的所有数字。

这些数字要从小到大排列,两个数字间用一个空格分开。

即类似:1 4 5 8 … 这样的答案。


笨笨有话说:只要一个组的成员确定了,另一个组的成员也就确定了。枚举一个组的成员就可以了。凭直觉,两个组的成员数目不会差太多吧。

歪歪有话说:既然求 1 所在的那个组,那只要枚举剩余的成员就可以了。貌似都是8个成员的可能性很大啊。

答案提交

注意,只提交这一组数字,不要填写任何多余的内容。

参考答案

#include <iostream> #include <algorithm> using namespace std; const int N = 20; int sum_1, sum_2, sum_3; int st[N], a[N]; void dfs(int u) { if(u == 8 && a[0] == 1) { int t1 = 0, t2 = 0, t3 = 0; for (int i = 0; i < 8; i ++) { t1 += a[i]; t2 += a[i] * a[i]; t3 += a[i] * a[i] * a[i]; } if(t1 == sum_1 && t2 == sum_2 && t3 == sum_3) { sort(a, a + 8); for (int i = 0; i < 8; i ++) cout << a[i] << " "; cout << endl; } return; } for (int i = 1; i <= 16; i ++) { if(!st[i]) { a[u] = i; st[i] = true; dfs(u + 1); st[i] = false; } } } int main() { for (int i = 1; i <= 16; i ++) { sum_1 += i; sum_2 += i * i; sum_3 += i * i * i; } sum_1 /= 2, sum_2 /= 2, sum_3 /= 2; dfs(0); return 0; }

答案解析

答案:1 4 6 7 10 11 13 16

上一题 下一题