POJ 1543 Perfect Cubes

Perfect Cubes
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 12595   Accepted: 6707

Description

For hundreds of years Fermat's Last Theorem, which stated simply that for n > 2 there exist no integers a, b, c > 1 such that a^n = b^n + c^n, has remained elusively unproven. (A recent proof is believed to be correct, though it is still undergoing scrutiny.) It is possible, however, to find integers greater than 1 that satisfy the "perfect cube" equation a^3 = b^3 + c^3 + d^3 (e.g. a quick calculation will show that the equation 12^3 = 6^3 + 8^3 + 10^3 is indeed true). This problem requires that you write a program to find all sets of numbers {a,b,c,d} which satisfy this equation for a <= N.

Input

One integer N (N <= 100).

Output

The output should be listed as shown below, one perfect cube per line, in non-decreasing order of a (i.e. the lines should be sorted by their a values). The values of b, c, and d should also be listed in non-decreasing order on the line itself. There do exist several values of a which can be produced from multiple distinct sets of b, c, and d triples. In these cases, the triples with the smaller b values should be listed first.

Sample Input

24

Sample Output

Cube = 6, Triple = (3,4,5)
Cube = 12, Triple = (6,8,10)
Cube = 18, Triple = (2,12,16)
Cube = 18, Triple = (9,12,15)
Cube = 19, Triple = (3,10,18)
Cube = 20, Triple = (7,14,17)
Cube = 24, Triple = (12,16,20)
题目大意:给定一个数n,三个数a,b,c大于1,问n以内有多少个数字满足n^3 = a^3 + b^3 + c^3。
#include <stdio.h>
#include <iostream>
#include <string.h>
using namespace std;

int ans[5];
int visted[200];
int selected[200];


void DFS(int n, int index)
{
    if (index == 3)
    {
        if (n * n * n == ans[0] * ans[0] * ans[0] + ans[1] * ans[1] * ans[1] + ans[2] * ans[2] * ans[2] && selected[ans[0]] * selected[ans[1]] * selected[ans[2]] == 0)
        {
            printf("Cube = %d, Triple = (%d,%d,%d)\n", n, ans[0], ans[1], ans[2]);
            selected[ans[0]] = selected[ans[1]] = selected[ans[2]] = 1;
        }
        return;
    }
    for (int i = 2; i < n; i++)
    {
        if (!visted[i])
        {
            visted[i] = 1;
            ans[index] = i;
            DFS(n, index + 1);
            visted[i] = 0;
        }
    }
}

int main()
{
    int n;
    scanf("%d", &n);
    for (int i = 6; i <= n; i++)
    {
        memset(visted, 0, sizeof(visted));
        memset(selected, 0, sizeof(selected));
        DFS(i, 0);
    }
    return 0;
}

 

posted on 2013-07-19 11:18  lzm风雨无阻  阅读(586)  评论(0编辑  收藏  举报

导航