有一个无限大的矩形,初始时你在左上角(即第一行第一列),每次你都可以选择一个右下方格子,并瞬移过去(如从下图中的红色格子能直接瞬移到蓝色格子),求到第n行第m列的格子有几种方案,答案对1000000007取模。
Input
单组测试数据。 两个整数n,m(2<=n,m<=100000)
Output
一个整数表示答案。
Input示例
4 5
Output示例
10
题解:只能想到画图发现在蓝色的区域满足杨辉三角
具体的组合数为C(n+m-4,n-2) or C(n+m-4,m-2)
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod = 1e9+7;
const int maxn = 1e6+10;
ll power(ll a,ll b) {
ll ans = 1;
while(b) {
if(b & 1) ans = ans * a % mod;
a = a * a % mod;
b >>= 1;
}
return ans;
}
ll fac[maxn],inv[maxn];
void init() {
fac[0] = fac[1] = 1;
inv[0] = inv[1] = 1;
for(int i=2;i<maxn;i++) {
fac[i] = fac[i-1] * i % mod;
inv[i] = power(fac[i],mod-2);
}
}
ll C(ll n,ll m) {
return fac[n] * (inv[m] * inv[n-m] % mod) % mod;
}
int main()
{
init();
int n,m;
while(~scanf("%d%d",&n,&m)) {
printf("%lld\n",C(n+m-4,min(n-2,m-2)));
}
return 0;
}