Возможно, вы ищете How to generate a combination by its number. Алгоритм состоит в создании последовательности C(a[i],i)
с i
, повторяющейся из числа элементов в комбинации до 1, так что сумма этих значений C равна вашему заданному числу. Затем те a[i]
получают инвертированные по длине-1 и производятся в результате. Код в Powershell, что делает этот пробег:
function getC {
# this returns Choose($big,$small)
param ([int32]$big,[int32]$small)
if ($big -lt $small) { return 0 }
$l=$big
$total=[int64]1
1..$small | % {
$total *= $l
$total /= $_
$l-=1
}
return $total
}
function getCombinationByNumber {
param([string[]]$array, [int32]$howMany, [int64[]]$numbers)
$total=(getc $array.length $howMany)-1
foreach($num in $numbers) {
[email protected]()
$num=$total-$num # for lexicographic inversion, see link
foreach($current in $howMany..1) {
# compare "numbers" to C($inner,$current) as soon as getting less than "numbers" take "inner"
foreach ($inner in $array.length..($current-1)) {
$c=getc $inner $current
if ($c -le $num) {
$num-=$c
$res+=$inner
break;
}
}
}
# $numbers=0, $res contains inverted indexes
[email protected]()
$l=$array.length-1
$res | % { $res2+=$array[$l-$_] }
return $res2
} }
Для запуска, обеспечить функцию массив, из которого получают комбинации, например, @(0,1,2,3,4,5,6,7,8,9)
, количество элементов в комбинации (3) и количество комбинаций, начиная с нуля. Пример:
PS C:\Windows\system32> [email protected](0,1,2,3,4,5,6,7,8,9)
PS C:\Windows\system32> getCombinationByNumber $b 3 0
0
1
2
PS C:\Windows\system32> [String](getCombinationByNumber $b 3 0)
0 1 2
PS C:\Windows\system32> [String](getCombinationByNumber $b 3 102)
4 5 8
Также с помощью обратного отслеживания, но вы не против заказа сейчас. – amit
@ user1990169 Вы пропустили '!'. Он уже показал, что знает, каково их число, он хочет настоящие комбинации. – amit
@amit Я вычислил факториал, но я думаю, что Op хочет все комбинации –