Лучшая программа для перестановки nPr больших чисел

0

Я новичок в программировании и застрял в части перестановки. У меня есть код, который работает для комбинации больших чисел, который хранится в матрице, но я не могу найти, что мне следует изменить, чтобы получить результат. Я попробовал рекурсивный метод для перестановок, но не смог добиться быстрых результатов.

Это код, который я получил для комбинации, каково должно быть изменение в состоянии, которое я должен сделать здесь, чтобы получить перестановки?

 void combination()
 {
   int i,j;
   for(i=0;i<100;i++)
   {
     nCr[i][0]=1;
     nCr[i][i]=1;
   }
   for(i=1;i<100;i++)
     for(j=1;j<100;j++)
        if (i!=j)
        {
          nCr[i][j] = (nCr[i-1][j] + nCr[i-1][j-1]);
        }
 }
  • 0
    Что вы пытаетесь вычислить? Моя математика немного устарела, но разве нет, если вы ищете nCr, то есть nCr[n][r] где n и r - значения, которые вы ищете.
  • 0
    если бы вы могли дать точное определение Permuation nPr для больших чисел, чтобы было ясно, что именно пытается делать ваша программа.
Показать ещё 1 комментарий
Теги:
algorithm
permutation
math

2 ответа

1

Правило повторения для перестановок можно легко получить из определения:

nPk = n*(n-1)*(n-2)* ... * (n-k+1) = n * (n-1)P(k-1)

Преобразован в код:

for(i=0;i<100;i++)
{
  nPr[i][0]=1;
}
for(i=1;i<100;i++)
  for(j=1;j<100;j++)
     if (i!=j)
     {
       nPr[i][j] = i * nPr[i-1][j-1];
     }

Обратите внимание, что количество перестановок быстро растет и переполняет хранилище, доступное для int: 13P11, например, уже выходит за пределы диапазона с 32-битными целыми числами.

  • 1
    @ Аки, мы говорим о перестановках, а не комбинациях. 13Р11 составляет 3.113.510.400> 2 ^ 31.
0

ну, вы можете использовать следующий псевдокод для вычисления перестановки и комбинации, учитывая, что мода всегда является очень большим простым числом.

для перестановки nPr

func permutation(r,n,mod):
    q=factorial(n) // you should precompute them and saved in an array for a better execution time  
    r=(factorial(r))%mod
    return (q*math.pow(r,mod-2))%mod

для комбинации nCr

func combination(r,n,mod):
    q=factorial(n)  
    r=(factorial(r)*factorial(n-r))%mod
    return (q*math.pow(r,mod-2))%mod

ваш должен прекоммутировать факториалы, для достойного времени выполнения.

fact[100000]
fact[0]=fact[1]=1
func factorial_compute():
    for x from 2 to 100000:
        fact[x]=(x*fact[x-1])%mod

следовательно, ваша факториальная функция будет

func factorial(x):
    return(fact[x])

для справки по математике для этого: http://mathworld.wolfram.com/ModularInverse.html

Ещё вопросы

Сообщество Overcoder
Наверх
Меню