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<int> indexList = new List<int>();
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));
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uTnVtZXJpY3M7CnVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwogCnB1YmxpYyBzdGF0aWMgY2xhc3MgQmlnSW50RXh0ZW5zaW9ucwp7CiAgICBwdWJsaWMgc3RhdGljIEJpZ0ludGVnZXIgRmFjdG9yaWFsKHRoaXMgQmlnSW50ZWdlciBpbnRlZ2VyKQogICAgewogICAgICAgIGlmKGludGVnZXIgPCAxKSByZXR1cm4gbmV3IEJpZ0ludGVnZXIoMSk7CiAKICAgICAgICBCaWdJbnRlZ2VyIHJlc3VsdCA9IGludGVnZXI7CiAgICAgICAgZm9yIChCaWdJbnRlZ2VyIGkgPSAxOyBpIDwgaW50ZWdlcjsgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICogaTsKICAgICAgICB9CiAKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQp9CiAKcHVibGljIGNsYXNzIFRlc3QKewogICAgcHVibGljIHN0YXRpYyBCaWdJbnRlZ2VyIENhbGNDb3VudChCaWdJbnRlZ2VyIG4sIEJpZ0ludGVnZXIgcikKICAgIHsKICAgICAgICBCaWdJbnRlZ2VyIHJlc3VsdCA9IG4uRmFjdG9yaWFsKCkgLyAobiAtIHIpLkZhY3RvcmlhbCgpOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgIAogICAgcHVibGljIHN0YXRpYyBpbnRbXSBudGhQZXJtKEJpZ0ludGVnZXIgbXlJbmRleCwgaW50IG4sIGludCByLCBCaWdJbnRlZ2VyIHRvdGFsKQogICAgewogICAgICAgIGludCBqID0gMCwgbjEgPSBuOwogICAgICAgIEJpZ0ludGVnZXIgdGVtcCwgaW5kZXgxID0gbXlJbmRleDsKICAgICAgIAogICAgICAgIHRlbXAgPSB0b3RhbCA7CiAgICAgICAgTGlzdDxpbnQ+IGluZGV4TGlzdCA9IG5ldyBMaXN0PGludD4oKTsKICAgICAgIAogICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgbjsgaysrKSB7CiAgICAgICAgICAgICAgIGluZGV4TGlzdC5BZGQoayk7CiAgICAgICAgfQogICAgICAgCiAgICAgICAgaW50W10gcmVzID0gbmV3IGludFtyXTsKIAogICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgcjsgaysrLCBuMS0tKSB7CiAgICAgICAgICAgIHRlbXAgLz0gbjE7CiAgICAgICAgICAgIGogPSAoaW50KSAoaW5kZXgxIC8gdGVtcCk7CiAgICAgICAgICAgIHJlc1trXSA9IGluZGV4TGlzdFtqXTsKICAgICAgICAgICAgaW5kZXgxIC09ICh0ZW1wICogIGopOwogICAgICAgICAgICBpbmRleExpc3QuUmVtb3ZlQXQoaik7CiAgICAgICAgfQogICAgICAgCiAgICAgICAgcmV0dXJuIHJlczsKICAgIH0KICAgCiAgICBwdWJsaWMgc3RhdGljIHZvaWQgTWFpbigpCiAgICB7CiAgICAgICAgaW50W10gdGVzdFNldCA9IHsxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxfTsKICAgICAgICBCaWdJbnRlZ2VyIG51bVBlcm1zLCBuLCByOwogICAgICAgIG4gPSB0ZXN0U2V0Lkxlbmd0aDsKICAgICAgICByID0gdGVzdFNldC5MZW5ndGg7CiAgICAgICAgbnVtUGVybXMgPSBDYWxjQ291bnQobiwgcik7CiAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUobnVtUGVybXMpOwogICAgICAgCiAgICAgICAgQmlnSW50ZWdlciB0ZXN0SW5kZXggPSBuZXcgQmlnSW50ZWdlcigxMjM0NTY3ODkwOTg3NjU0MzIxKTsKICAgICAgICBpbnRbXSBteU50aEluZGV4ID0gbnRoUGVybSh0ZXN0SW5kZXgsIChpbnQpIG4sIChpbnQpIHIsIG51bVBlcm1zKTsKICAgICAgICBpbnRbXSBteU50aFBlcm0gPSBuZXcgaW50WyhpbnQpIHJdOwogCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAoaW50KSByOyBpKyspIHsKICAgICAgICAgICAgICAgbXlOdGhQZXJtW2ldID0gdGVzdFNldFtteU50aEluZGV4W2ldXTsKICAgICAgICB9CiAgICAgICAKICAgICAgICBDb25zb2xlLldyaXRlTGluZShzdHJpbmcuSm9pbigiLCIsIG15TnRoUGVybSkpOwogICAgfQp9
51090942171709440000
1,12,4,18,20,19,7,5,16,11,6,8,21,15,13,2,14,9,10,17,3