예제 #1
0
        public static long Solution()
        {
            long solution = 0;
            long mLimit   = (long)1e4;

            HashSet <long> squares = new HashSet <long>();

            for (long m = 2; m < mLimit; m++)
            {
                long kLimit = (long)Math.Sqrt(limit / (m * m * m) + 1);
                var  step   = 2 - (m % 2);
                for (long r = 1; r < m; r += step)
                {
                    if (UtilityFunctions.Gcd(m, r) != 1)
                    {
                        continue;
                    }
                    if (m * m * m * r + r * r >= limit)
                    {
                        break;
                    }
                    for (long k = 1; k <= kLimit; k++)
                    {
                        long n = k * k * m * m * m * r + k * r * r;
                        if (n >= limit)
                        {
                            break;
                        }
                        if (UtilityFunctions.IsPerfectSquare(n))
                        {
                            if (!squares.Contains(n))
                            {
                                solution += n;
                                squares.Add(n);
                            }
                        }
                    }
                }
            }
            return(solution);
        }
예제 #2
0
        public static long Solution()
        {
            long solution = 0;

            for (int a = 1; a <= limit; a++)
            {
                for (int c = 1; c <= a; c++)
                {
                    for (int b = 1; b <= limit; b++)
                    {
                        for (int d = 1; d <= b; d++)
                        {
                            var internalPoints =
                                ((a + c) * (b + d)
                                 - UtilityFunctions.Gcd(a, b)
                                 - UtilityFunctions.Gcd(b, c)
                                 - UtilityFunctions.Gcd(c, d)
                                 - UtilityFunctions.Gcd(d, a)) / 2 + 1;
                            if (UtilityFunctions.IsPerfectSquare(internalPoints))
                            {
                                solution += 4;
                                if (a == c || b == d)
                                {
                                    solution -= 2;
                                    if (a == c && b == d)
                                    {
                                        solution -= 1;
                                    }
                                }
                            }
                        }
                    }
                }
            }


            return(solution);
        }
예제 #3
0
        public static long SolutionOld()
        {
            long answer     = 0;
            var  validPairs = new Dictionary <long, HashSet <long> >();
            var  validSums  = new HashSet <long>();

            for (long p = 2; p < limit; p++)
            {
                for (long q = 1; q < p; q++)
                {
                    if (p + q > limit)
                    {
                        break;
                    }
                    if (p % 2 == 1)
                    {
                        if ((q % 2 == 1) && (p * q) % 4 != 3)
                        {
                            continue;
                        }
                        if (q % 4 == 2)
                        {
                            continue;
                        }
                    }
                    else
                    {
                        if ((p % 4 == 2) && (q % 2 == 1))
                        {
                            continue;
                        }
                    }

                    var aSquare = (p * p + q * q + p * q);
                    if (!UtilityFunctions.IsPerfectSquare(aSquare))
                    {
                        continue;
                    }
                    if (validPairs.ContainsKey(p))
                    {
                        validPairs[p].Add(q);
                        if (validPairs.ContainsKey(q))
                        {
                            long sum = long.MaxValue;
                            foreach (var r in validPairs[q])
                            {
                                if (validPairs[p].Contains(r))
                                {
                                    var bSquare = p * p + r * r + p * r;
                                    var cSquare = r * r + q * q + r * q;
                                    if (bSquare + cSquare < aSquare)
                                    {
                                        var bc = Math.Sqrt(bSquare * cSquare);
                                        if (bSquare + cSquare + bc < aSquare)
                                        {
                                            continue;
                                        }
                                    }
                                    sum = p + q + r;
                                    if (sum < limit)
                                    {
                                        validSums.Add(sum);
                                        Console.WriteLine($"{p} {q} {r} {sum}");
                                    }
                                }
                            }
                        }
                    }
                    else
                    {
                        validPairs.Add(p, new HashSet <long> {
                            q
                        });
                    }
                }
            }
            foreach (var sum in validSums)
            {
                answer += sum;
            }
            return(answer);
        }