using System; using System.Numerics; using System.Collections.Generic; public static class BigIntExtensions { public static BigInteger Factorial(this BigInteger integer) { if(integer < 1) return new BigInteger(1); BigInteger result = integer; for (BigInteger i = 1; i < integer; i++) { result = result * i; } return result; } } public class Test { public static BigInteger CalcCount(BigInteger n, BigInteger r) { BigInteger result = n.Factorial() / (n - r).Factorial(); return result; } public static int[] nthPerm(BigInteger myIndex, int n, int r, BigInteger total) { int j = 0, n1 = n; BigInteger temp, index1 = myIndex; temp = total ; List indexList = new List(); for (int k = 0; k < n; k++) { indexList.Add(k); } int[] res = new int[r]; for (int k = 0; k < r; k++, n1--) { temp /= n1; j = (int) (index1 / temp); res[k] = indexList[j]; index1 -= (temp * j); indexList.RemoveAt(j); } return res; } public static void Main() { int[] testSet = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21}; BigInteger numPerms, n, r; n = testSet.Length; r = testSet.Length; numPerms = CalcCount(n, r); Console.WriteLine(numPerms); BigInteger testIndex = new BigInteger(1234567890987654321); int[] myNthIndex = nthPerm(testIndex, (int) n, (int) r, numPerms); int[] myNthPerm = new int[(int) r]; for (int i = 0; i < (int) r; i++) { myNthPerm[i] = testSet[myNthIndex[i]]; } Console.WriteLine(string.Join(",", myNthPerm)); } }