//c(n,r)=n!/(r!*(n-r)!),要求组合数就要求阶乘,而阶乘是个很大的数,普通int肯定会溢出。
//法一:
//求(n-r+1)/(r)*....*n/1,就是一边乘同时一边除
typedef __int64 LL;
void print(LL n,LL r)
{
if(r>n/2)r=n-r;//c(n,r)=c(n,n-r)用此来减少计算次数
LL a=1,b=1;
LL i;
for(i=1;i<=r;i++)
{
a*=n-i+1;
b*=i;
if(!a%b){
a/=b;
b=1;
}
}
cout<<fixed<<setprecision(0)<<(a/b)<<endl;
}
//法二:
//利用c(i,j)=c(i-1,j)+c(i-1,j-1)求出所有情况
LL c[101][101];
void get(int n)
{
int i,j;
for(i=0;i<=n;i++)c[i][0]=1;
for(int i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
c[i][j]=c[i-1][j]+c[i-1][j-1];
}
}
}
组合-组合数求法
最新推荐文章于 2021-06-13 22:26:05 发布