using System.Collections.Generic;
public static void Main()
var calculator = new StairClimbingPossibilitiesCalculator();
Console.WriteLine(calculator.Climb(190));
public class StairClimbingPossibilitiesCalculator
private int[] stepVariations = new int[] {1, 2, 3};
private Dictionary<int, BigInteger> cachedPossibilitesByStepsCount = new Dictionary<int, BigInteger>();
public BigInteger Climb(int stepsCount)
BigInteger cachedPossibilitiesCount = 0;
if (cachedPossibilitesByStepsCount.TryGetValue(stepsCount, out cachedPossibilitiesCount))
return cachedPossibilitiesCount;
BigInteger possibilites = 0;
foreach(int stepVariation in stepVariations)
possibilites += Climb(stepsCount - stepVariation);
cachedPossibilitesByStepsCount.Add(stepsCount, possibilites);