【发布时间】:2013-01-28 06:00:48
【问题描述】:
我将数字的排列计算为:-
nPr = n!/(n-r)!
其中给出了 n 和 r。
1<= n,r <= 100
i find p=(n-r)+1
and
for(i=n;i>=p;i--)
multiply digit by digit and store in array.
但是我将如何计算 nCr = n!/[r! * (n-r)!] 为相同的范围。?
我使用递归来做到这一点,如下所示:-
#include <stdio.h>
typedef unsigned long long i64;
i64 dp[100][100];
i64 nCr(int n, int r)
{
if(n==r) return dp[n][r] = 1;
if(r==0) return dp[n][r] = 1;
if(r==1) return dp[n][r] = (i64)n;
if(dp[n][r]) return dp[n][r];
return dp[n][r] = nCr(n-1,r) + nCr(n-1,r-1);
}
int main()
{
int n, r;
while(scanf("%d %d",&n,&r)==2)
{
r = (r<n-r)? r : n-r;
printf("%llu\n",nCr(n,r));
}
return 0;
}
但 n 60 。
【问题讨论】:
-
查看wikipedia page on combination,解决方案就在那里。
-
备注: 对于 n = 100,r = 50,你有 nCr = 100891344545564193334812497256,它不适合 64 位变量。
-
另外,请记住 nCr = nC(n - r)。
标签: algorithm math combinations