static void Calculate(PrimeCalculator calculator, List<ulong> allPrimes, List<ulong> currentPrimes, int primeIndex, ulong currentMul, ulong limit) { if (Check(currentPrimes, calculator)) sum += currentPrimes.Prod(); for (int i = primeIndex; i < allPrimes.Count; i++) { if (currentMul * allPrimes[i] >= limit) break; var newPrimes = new List<ulong>(currentPrimes); newPrimes.Add(allPrimes[i]); Calculate(calculator, allPrimes, newPrimes, i+1, currentMul*allPrimes[i], limit); } }