51nod 1119 机器人走方格 V2 【组合数学】

挺水的但是我好久没写组合数了…
用这样一个思想,在1~m列中,考虑每一列上升几格,相当于把n-1个苹果放进m个篮子里,可以为空,问有几种方案。
这个就是一个组合数学经典问题了,考虑n个苹果放进m个篮子里,不可以为空的情况,用插板法,也就是把m-1个板子插进排成一排的果子里,分成m个不为空的区间,方案数为\( C_{n-1}^{m-1} \),现在考虑n个苹果放进m个篮子里,可以为空的情况,可以想成每个篮子里事先都放了一个苹果,那么就转为了上一个问题,方案数为\( C_{n+m-1}^{m-1} \)
回到这道题上,答案就是\( C_{n+m-2}^{m-1} \)

#include<iostream>
#include<iostream>
using namespace std;
const int mod=1e9+7,N=1000005;
long long n,m,inv[N],ans=1;
long long ksm(long long a,long long b)
{
	long long r=1ll;
	while(b)
	{
		if(b&1)
			r=r*a%mod;
		a=a*a%mod;
		b>>=1;
	}
	return r;
}
int main()
{
	scanf("%lld%lld",&n,&m);
	for(int i=1;i<=n+m-2;i++)
		ans=ans*i%mod;
	for(int i=1;i<=n-1;i++)
		ans=ans*ksm(i,mod-2)%mod;
	for(int i=1;i<=m-1;i++)
		ans=ans*ksm(i,mod-2)%mod;
	printf("%lld\n",ans);
	return 0;
}
posted @ 2018-01-23 16:43  lokiii  阅读(197)  评论(0编辑  收藏  举报