题意:2249就是纯粹求组合数。1942说有一个n*m的方格,问从左下走到右上(只能向右或者向上走)有多少种走法。
思路:对于1942来说,就是C(n+m,n),相当于有一个n+m长的序列,选出n个位置向右走,剩下的必然就是向上走。
这两道题开long long即可。计算的时候注意除的时候从小到大(即从1到n),这样可以保证每次都是整除。比如求C(n,m),第一步n/1,第二步n*(n-1)/2,必然能够整除;后面以此类推。
1942代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <cstdlib>
using namespace std;
#define clc(s,t) memset(s,t,sizeof(s))
#define INF 0x3fffffff
long long n,m;
int main(){
while(scanf("%lld %lld",&n,&m)&&(m+n)){
int i;
long long a,b,res=1;
a = n+m;
b = min(n,m);
for(i = 0;i<b;i++)
res = res*(a-i)/(1+i);
printf("%lld\n",res);
}
}