Beispiel #1
0
        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;
        }