public long Solve() { var primes = new Prime(Limit); var numberDivisors = new Dictionary<int, int>(); for (var number = 1; number <= Limit; number++) { var decomposition = primes.GetDecomposition(number); var sum = 1; foreach (var divisor in decomposition) { sum *= this.GetSumDivisors(divisor); } sum -= number; if (sum < Limit && sum != 1) { numberDivisors.Add(number, sum); } } var lines = new Dictionary<long, long>(); foreach (var numberDivisor in numberDivisors) { var minValueStart = numberDivisor.Key; var nextValue = numberDivisor.Value; var group = new HashSet<int> { minValueStart }; var currentCount = 1; while (minValueStart != nextValue && nextValue > minValueStart && currentCount == group.Count) { if (numberDivisors.ContainsKey(nextValue)) { group.Add(nextValue); nextValue = numberDivisors[nextValue]; currentCount++; } else { nextValue = 0; } } if (nextValue == minValueStart && group.Count > 1) { lines.Add(minValueStart, group.Count); } } return lines.Where(t => t.Value == lines.Max(r => r.Value)).Min(t => t.Key); }
public long Solve() { var primes = new Prime(Max); var radValues = new Dictionary<long, long> { { 1, 1 } }; for (var n = 2; n <= Max; n++) { var primeFactorization = primes.GetDecomposition(n); var product = primeFactorization.Aggregate(1L, (current, p) => current * p.Key); radValues.Add(n, product); } var count = 0; foreach (var radValue in radValues.OrderBy(t => t.Value).ThenBy(t => t.Key)) { count++; if (count == 10000) return radValue.Key; } return 0; }
public long Solve() { var primeUtil = new Prime(Limit); var numbers = new HashSet<long>(); foreach (var prime in primeUtil.PrimeList) { if (prime < Limit) numbers.Add(prime + 1); } Console.WriteLine(numbers.Count); Console.WriteLine(numbers.Max()); var factorization = new Dictionary<long, Dictionary<long, long>>(); foreach (var number in numbers) { factorization.Add(number, primeUtil.GetDecomposition(number)); } Console.WriteLine("Faktorizace Done"); return 0; }