xtuoj-grid

 一个N*M的网格,从左下角沿格子线走到右上角,只能往右或者往上走,
 请问有多少种不同的路线?
输入

多个样例,每行包含两个整数N,M(1≤N,M≤33);如果N和M为0表示输入结束。
输出

每个样例输出一行,为路线的数目。
样例输入

1 1
1 2
33 33
0 0

样例输出

2
3
7219428434016265740

/************method 2****************/
#include <stdio.h>
#include <stdlib.h>
#define N 34
long long a[34][34];
void ways2()
{
    int i,j;
    for(i=0; i<N ;i++)
        a[i][0]=a[0][i]=1;
    for(i=1; i<N ;i++)
        for(j=1; j<N ;j++)
            a[i][j]=a[j][i]=a[i-1][j]+a[i][j-1];
}
int main()
{
    int n,m;
    ways2();
    while(scanf("%d%d",&n,&m)==2&&(n||m))
        printf("%I64d\n",a[n][m]);
    return 0;
}

/***********method 1****************/
#include <stdio.h>
#include <stdlib.h>
#define LL long long
LL gcd(LL a,LL b)
{
    if(!a||!b)return a+b;
    for(; b ;a^=b,b^=a,a^=b)
        a%=b;
    return a;
}
LL ways(LL n,LL m)
{
    LL numerator,denominator,tn,g;
    if(!n || !m)return 1;
    if(n<m)n^=m,m^=n,n^=m;//之前这个一直通不过,不知是不是这两个if语句在作怪
    for(tn=numerator=n+m,denominator=m; m>1; ){
        numerator*=--tn;
        denominator*=--m;
        g=gcd(numerator,denominator);
        numerator/=g;
        denominator/=g;
    }
    return numerator/denominator;
}
int main()
{
    int n,m;
    while(scanf("%d%d",&n,&m)==2&&(n||m))
        printf("%I64d\n",ways((LL)n,(LL)m));
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值