把可能性列一遍:因为每个格子等于所有前面可能跳跃过去的格子可能性+1再全部相加,
1 | 0 | 0 | 0 | 0 | 0 |
0 | 1 | 1 | 1 | 1 | 1 |
0 | 1 | 2 | 3 | 4 | 5 |
0 | 1 | 3 | 6 | 10 | 15 |
0 | 1 | 4 | 10 | 15 | 30 |
0 | 1 | 5 | 15 | 30 | 60 |
看出什么没? 没看出来? 那就把电脑屏幕倾斜过来,是不是很像杨辉三角?没错,这就是一个杨辉三角,这个问题就可以转化成组合数的问题了,要注意这里的行列与杨辉三角的行列转化关系,不多说,代码:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
#define ll long long
const ll mod=1e9+7;
const ll N = 100010;
ll inv[N];
void niyuan(){
inv[1]=1;
for(ll i=2; i<N; i++)
inv[i] = (mod-mod/i) * inv[mod%i]%mod;
}
int main(){
ll m,n;
niyuan();
while(scanf("%lld%lld",&n,&m)!=EOF){
n =m+n-4;
m-=2;
ll ans = 1;
for(ll i=1;i <= m; i++){
ans=ans*(n+1-i)%mod;
ans = ans*inv[i]%mod;
}
printf("%lld\n",ans);
}
return 0;
}