Beispiel #1
0
        private static long NumberOfWays(long numerator, long denominator, long lowerLimit, long upperLimit)
        {
            if (upperLimit == lowerLimit)
            {
                return(numerator * lowerLimit * lowerLimit == denominator ? 1 : 0);
            }

            var newLowerLimit = (long)Math.Sqrt(denominator / (double)numerator) + 1;

            lowerLimit = Math.Max(lowerLimit, newLowerLimit + 1);

            if (primes.Contains(upperLimit))
            {
                upperLimit -= 1;
            }
            if (primes.Contains(lowerLimit))
            {
                lowerLimit += 1;
            }

            long newNumerator   = numerator * lowerLimit * lowerLimit - denominator;
            long newDenominator = denominator * lowerLimit * lowerLimit;
            var  gcd            = UtilityFunctions.Gcd(newNumerator, newDenominator);

            long containsLowerLimit       = NumberOfWays(newNumerator / gcd, newDenominator / gcd, lowerLimit + 1, upperLimit);
            long doesNotContainLowerLimit = NumberOfWays(numerator, denominator, lowerLimit + 1, upperLimit);

            return(containsLowerLimit + doesNotContainLowerLimit);
        }
Beispiel #2
0
        public static long Solution()
        {
            long solution = 0;

            var primes = UtilityFunctions.Primes(limit);

            foreach (var p in primes.Where(t => t > 4))
            {
                UtilityFunctions.Gcd(-24, p, out long inverse, out var dummy);

                var residue = ((inverse + p) * 9) % p;
                solution += (residue % p);
            }

            return(solution);
        }
        public static long Solution()
        {
            long solution     = 0;
            var  stopwatch    = new Stopwatch();
            var  gcdStopwatch = new Stopwatch();

            for (long a = 1; a <= Math.Sqrt(limit); a++)
            {
                var stepSize = 2 - (a % 2);
                for (long b = 1; b < a; b += stepSize)
                {
                    gcdStopwatch.Start();
                    var g = UtilityFunctions.Gcd(a, b);
                    gcdStopwatch.Stop();
                    if (g > 1)
                    {
                        continue;
                    }
                    var n = a * a + b * b;
                    if (n > limit)
                    {
                        break;
                    }
                    var floor = limit / n;
                    stopwatch.Start();
                    for (long k = 1; k <= floor; k++)
                    {
                        solution += 2 * (a + b) * k * (limit / (k * n));
                    }
                    stopwatch.Stop();
                }
            }
            Console.WriteLine($"Time spent calculating gcd: {gcdStopwatch.ElapsedMilliseconds}");
            Console.WriteLine($"Time spent in first loop: {stopwatch.ElapsedMilliseconds}");
            stopwatch.Restart();
            for (long i = 1; i <= limit; i++)
            {
                solution -= (limit % i) * (i % 2 == 0? 2:1);
            }
            stopwatch.Stop();
            solution += limit * limit + limit * (limit / 2);
            Console.WriteLine($"Time spent in second loop: {stopwatch.ElapsedMilliseconds}");
            return(solution);
        }
Beispiel #4
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);
        }
        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);
        }
Beispiel #6
0
        public static long Solution()
        {
            long answer     = 0;
            var  validPairs = new Dictionary <long, HashSet <long> >();
            var  validSums  = new HashSet <long>();

            for (long m = 2; m < limit; m++)
            {
                var stepSize = 2 - (m % 2);
                for (long n = 1; n < m; n += stepSize)
                {
                    if (UtilityFunctions.Gcd(m, n) != 1 || (m - n % 3) == 0)
                    {
                        continue;
                    }

                    var firstSide  = 2 * m * n + n * n;
                    var secondSide = m * m - n * n;
                    if (m * m + 2 * m * n > limit)
                    {
                        break;
                    }
                    var p = Math.Max(firstSide, secondSide);
                    var q = Math.Min(firstSide, secondSide);
                    for (long k = 1; k < limit; k++)
                    {
                        if (k * (p + q) > limit)
                        {
                            break;
                        }
                        if (validPairs.ContainsKey(k * p))
                        {
                            validPairs[k * p].Add(k * q);
                        }
                        else
                        {
                            validPairs.Add(k * p, new HashSet <long> {
                                k *q
                            });
                        }
                    }
                }
            }

            foreach (var p in validPairs.Keys)
            {
                foreach (var q in validPairs[p])
                {
                    if (validPairs.ContainsKey(q))
                    {
                        long sum = long.MaxValue;
                        foreach (var r in validPairs[q])
                        {
                            if (validPairs[p].Contains(r))
                            {
                                var aSquare = p * p + q * q + p * q;
                                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}");
                                }
                            }
                        }
                    }
                }
            }

            foreach (var sum in validSums)
            {
                answer += sum;
            }
            return(answer);
        }