Advertisement
pkuderov

Narayana numbers

Sep 14th, 2014
360
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 5.12 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.IO;
  6.  
  7. namespace SO.BrutForce
  8. {
  9.     class State: IEquatable<State>
  10.     {
  11.         public long p, q, k;
  12.  
  13.         public State() { }
  14.        
  15.         #region IEquatable<State> Members
  16.  
  17.         public bool Equals(State other)
  18.         {
  19.             return p == other.p && q == other.q && k == other.k;
  20.         }
  21.  
  22.         public override int GetHashCode()
  23.         {
  24.             return ((p << 40) + (q << 20) + k).GetHashCode();
  25.         }
  26.  
  27.         #endregion
  28.     }
  29.     struct Pair : IEquatable<Pair>
  30.     {
  31.         public long n, k;
  32.         #region IEquatable<Pair> Members
  33.  
  34.         public bool Equals(Pair other)
  35.         {
  36.             return n == other.n && k == other.k;
  37.         }
  38.  
  39.         public override int GetHashCode()
  40.         {
  41.             return ((k << 32) + n).GetHashCode();
  42.         }
  43.         #endregion
  44.     }
  45.     class Program
  46.     {
  47.         const long MODULO = 1000000009L;
  48.         const int MaxN = 50;
  49.         const int MaxK = 10;
  50.         static Dictionary<State, long> memory = new Dictionary<State, long>();
  51.         static Dictionary<Pair, long> pairs = new Dictionary<Pair, long>();
  52.  
  53.         static TimeSpan timer1 = new TimeSpan();
  54.         static TimeSpan timer2 = new TimeSpan();
  55.        
  56.         static void Main(string[] args)
  57.         {
  58.             for (int k = 1; k <= MaxK; k++)
  59.             {
  60.                 for (int n = k; n <= MaxN; n++)
  61.                 {
  62.                     //CheckWithBruteForce(writer, n, k);
  63.                     Solve(n, k);
  64.                 }
  65.             }
  66.             Console.WriteLine("{0}", timer1);
  67.  
  68.             using (var writer = new StreamWriter("../../../output"))
  69.             {
  70.                 writer.WriteLine(
  71.                     string.Join(" ", Enumerable.Range(0, MaxN + 2).Select(x => Format(x)))
  72.                 );
  73.  
  74.                 Console.WriteLine();
  75.                 for (int n = 1; n <= MaxN; n++)
  76.                 {
  77.                     writer.Write("{0}: ", Format(n).Substring(1));
  78.                     for (int k = 1; k <= Math.Min(n, MaxK); k++)
  79.                     {
  80.                         writer.Write("{0} ", Format(GetFunc(new Pair { n = n - k, k = k })));
  81.                     }
  82.                     writer.WriteLine();
  83.                 }
  84.             }
  85.         }
  86.  
  87.         private static string Format(long x)
  88.         {
  89.             return string.Format("{0, 10}", x);
  90.         }
  91.  
  92.         private static void Solve(int n, int k)
  93.         {
  94.             var p = new Pair { n = n, k = k };
  95.             var res1 = GetFunc(p);
  96.         }
  97.  
  98.         private static void CheckWithBruteForce(StreamWriter writer, int n, int k)
  99.         {
  100.             var state = new State { p = n, q = n, k = k };
  101.             var res1 = Func(state);
  102.             var res2 = F(n - k, k);
  103.             writer.WriteLine("{0,4}.{1,3}.{2}: {3,8} {4,6}", n, k, res1 == res2 ? "OK" : "!!", res1, res2);
  104.         }
  105.        
  106.         private static long F(long n, long k)
  107.         {
  108.             if (n == 0 || k == 1)
  109.                 return 1;
  110.            
  111.             long sum = 0;
  112.             var p = new Pair { n = n - 1, k = k };
  113.             sum += GetFunc(p) % MODULO;
  114.  
  115.             for (long j = 1; j < k; j++)
  116.             {
  117.                 for (long i = (j == 1) ? 0 : 1; i <= n; i++)
  118.                 {
  119.                     p.n = (j == 1) ? i : i - 1; p.k = j;
  120.                     long x = GetFunc(p);
  121.  
  122.                     p.n = n - i; p.k = k - j;
  123.                     long y = GetFunc(p);
  124.  
  125.                     sum += x * y;
  126.                     if (sum >= MODULO)
  127.                         sum %= MODULO;
  128.                 }
  129.             }
  130.             return sum;
  131.         }
  132.  
  133.         private static long GetFunc(Pair p)
  134.         {
  135.             long x = 0;
  136.  
  137.             if (p.n == 0 || p.k == 1)
  138.                 x = 1;
  139.             if (pairs.ContainsKey(p))
  140.                 x = pairs[p];
  141.             else
  142.             {
  143.                 x = F(p.n, p.k);
  144.                 pairs[p] = x;
  145.             }
  146.             return x;
  147.         }
  148.  
  149.         private static long Func(State state)
  150.         {
  151.             if (!(state.p > 0 && state.q > 0 && state.p <= state.q))
  152.                 return 0;
  153.             if (state.k == 1)
  154.                 return 1;
  155.  
  156.             if (memory.ContainsKey(state))
  157.                 return memory[state];
  158.  
  159.             long sum = 0;
  160.             for (var i = 1; i <= state.p; i++)
  161.             {;
  162.                 for (var j = 1; j <= state.q; j++)
  163.                 {
  164.                     var newState = new State { p = state.p - i, q = state.q - j, k = state.k - 1 };
  165.                     long res = 0;
  166.  
  167.                     if (memory.ContainsKey(newState))
  168.                         res = memory[newState];
  169.                     else
  170.                     {
  171.                         res = Func(newState);
  172.                         memory[newState] = res;
  173.                     }
  174.                     sum += res;
  175.                 }
  176.                 if (sum >= MODULO)
  177.                     sum = sum % MODULO;
  178.             }
  179.             return sum;
  180.         }
  181.     }
  182. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement