internal static long PandigitalPrimeSets(List <long> digits) { if (digits.Count == 0) { return(1); } long count = 0; digits.Sort(); var maxElement = digits[digits.Count - 1]; var restOfDigits = UtilityFunctions.Complement(new List <long> { maxElement }, digits); var subsets = UtilityFunctions.GenerateSubsets(restOfDigits); foreach (var subset in subsets) { subset.Add(maxElement); var complement = UtilityFunctions.Complement(subset, digits); var subsetDigitSignature = UtilityFunctions.DigitSignature(subset, ProblemDigits); count += PrimeCandidates[subsetDigitSignature].Count * PandigitalPrimeSets(complement); } return(count); }