xtuoj-grid

来源:互联网 发布:mac文明5控制台 编辑:程序博客网 时间:2024/05/17 03:57
 一个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 34long 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 longLL 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;}


0 0
原创粉丝点击