static long distinctCount(IEnumerable <long> source, long length, long remaining, long skippable) { if (skippable < 0L) { return(0L); } if (skippable == 0L) { return(Combinatoric.Multinomial(source)); } var count = source.First(); if (count >= length) { return(remaining.Power((int)length)); } var others = source.Skip(1); var result = distinctCount(others, length, remaining - 1L, skippable - count); for (var x = 1L; x <= count; x++) { var temp = distinctCount(others, length - x, remaining - 1L, skippable + x - count); result = checked (result + Combinatoric.Choose(length, x) * temp); } return(result); }
public static void Choose() { //this example shows how to get binomial //use Combinatoric.Choose(n, k) for n!/(k!*(n-k)!) Console.WriteLine(Combinatoric.Choose(10, 5)); }
//constructors //static methods static long count(IEnumerable <T> source, int length, CombinatoricModel model) { switch (model) { case CombinatoricModel.Normal: return(Combinatoric.Choose((long)source.Count(), length)); case CombinatoricModel.Repetition: return(Combinatoric.Choose((long)source.Count() + length - 1L, length)); case CombinatoricModel.Distinct: var lookup = source.ToLookup(x => x); return(distinctCount(lookup.Select(x => x.LongCount()).OrderBy(x => x).ToList(), length, lookup.Count, source.Count() - length)); case CombinatoricModel.RepetitionDistinct: return(Combinatoric.Choose(source.Distinct().LongCount() + length - 1, length)); default: return(0L); } }
static long count(IEnumerable <T> source) { var length = source.Count() - 1L; return(Combinatoric.Choose(2L * length, length) / (length + 1L)); }