Cristiano Magro
2025-10-04 a70c2252becc1e607305909a2230257847c57455
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
import java.util.*;
 
public class SommaDiDueCubiHash {
    // Classe per tener coppie (a, b)
    static class Pair {
        int a, b;
        Pair(int a, int b) {
            this.a = a;
            this.b = b;
        }
        @Override
        public String toString() {
            return a + "^3 + " + b + "^3";
        }
    }
 
    public static void main(String[] args) {
        if (args.length != 1) {
            System.out.println("Uso: java RamanujanOptimized <n>");
            return;
        }
        int n;
        try {
            n = Integer.parseInt(args[0]);
        } catch (NumberFormatException e) {
            System.out.println("Errore: inserire un intero valido.");
            return;
        }
 
        // Mappa: somma (long) -> lista di coppie (a, b)
        Map<Long, List<Pair>> map = new HashMap<>();
 
        for (int a = 1; a <= n; a++) {
            for (int b = a + 1; b <= n; b++) {
                long sum = (long)a * a * a + (long)b * b * b;
                if (sum > n) continue;
                // Aggiungi la coppia alla mappa
                if (!map.containsKey(sum)) {
                    map.put(sum, new ArrayList<>());
                }
                map.get(sum).add(new Pair(a, b));
            }
        }
 
        // Scorri le somme che hanno almeno due coppie
        for (Map.Entry<Long, List<Pair>> entry : map.entrySet()) {
            List<Pair> list = entry.getValue();
            if (list.size() >= 2) {
                long sum = entry.getKey();
 
                // Per ogni coppia almeno due diverse
                // Stampiamo tutti i modi distinti (evitando inversioni)
                // Per esempio, solo combinazioni (i, j) con i<j,
                // e confrontare coppie con ordine per evitare duplicati
                for (int i = 0; i < list.size(); i++) {
                    for (int j = i + 1; j < list.size(); j++) {
                        Pair p1 = list.get(i);
                        Pair p2 = list.get(j);
                        // Evita se sono la stessa coppia inversa (non dovrebbe capitare con a<b)
                        // Assicuriamoci che le coppie siano distinte
                        if (p1.a == p2.a && p1.b == p2.b) continue;
 
                        System.out.println(sum + " = " + p1 + " = " + p2);
                    }
                }
            }
        }
    }
}