public long Solve() { var primeUtilis = new Prime(Limit); var primeSum = primeUtilis.PrimeList.Where(t => t < Limit).Sum(); var array = new long[primeSum + 1]; var array2 = new Dictionary<long, long> { { 0, 1 } }; array[0] = 1; var sp = 0L; foreach (var prime in primeUtilis.PrimeList.Where(t => t < Limit)) { sp += prime; for (var i = sp; i > prime - 1; i--) { array[i] = (array[i] + array[i - prime]) % Modulo; } foreach (var oldItem in array2.OrderByDescending(t => t.Key)) { var newKey = oldItem.Key + prime; if (!array2.ContainsKey(newKey)) { array2.Add(newKey, 0); } array2[newKey] = (array2[newKey] + oldItem.Value) % Modulo; } } var primeUtils2 = new Prime(sp); var sum = 0L; for (var i = 0; i <= sp; i++) { if (primeUtils2.IsPrime(i)) { sum = (sum + array[i]) % Modulo; } } var sum2 = 0L; foreach (var a in array2) { if (primeUtils2.IsPrime(a.Key)) { sum2 = (sum2 + a.Value)%Modulo; } } Console.WriteLine(sum); Console.WriteLine(sum2); return sum; }