一个N*M的网格,从左下角沿格子线走到右上角,只能往右或者往上走,
请问有多少种不同的路线?
输入
多个样例,每行包含两个整数N,M(1≤N,M≤33);如果N和M为0表示输入结束。
输出
每个样例输出一行,为路线的数目。
样例输入
1 1
1 2
33 33
0 0
样例输出
2
3
7219428434016265740
请问有多少种不同的路线?
输入
多个样例,每行包含两个整数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;
}