poj 1942 Paths on a Grid

本文介绍了一种使用C++实现的高效组合数计算方法,并通过优化减少中间计算过程中的数值大小,避免溢出,适用于解决组合数学问题。该程序能够接受用户输入两个长整型数字并输出它们的组合数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



#include<iostream>
#include<cstdio>
using namespace std;
/*
int com(int n,int r)//C(n,r)
{
if(n-r>r)r=n-r;
int i,j=1,ans=1;
for(i=0,j=1;i<r;i++)
{
ans*=(n-i);
for(;j<=r&&ans%j==0;j++)
ans/=j;
}
return ans;
}*/
long long com(long long n,long long r)
{
long long a=1,i;
for(i=1;i<=r;i++)
        a=a*(n-i+1)/i;//a*=(n-i+1)/i;
return a;
}


int main()
{
long long n,m;
while(scanf("%lld %lld",&n,&m)!=EOF)
{
long long temp=n;
if(n==0&&m==0)
break;
if(n>m)
temp=m;
long long   ans=com(n+m,temp);
printf("%lld\n",ans);


}
    system("pause");
return 0;
}


/*
#include <iostream>
using namespace std;
double CNM(unsigned int N, unsigned int M)
{
    M = (M > N - M) ? N - M : M;
    double ret = 1;
    while(M > 0)
ret *= double(N--) / double (M--);
    return ret;
}
int main(int argc, char* argv[])
{
    unsigned int A, B;
    while(scanf("%d %d", &A, &B) && !(A == 0 && B == 0))
        printf("%.0lf\n",CNM(A + B, B));
    return 0;
}*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值