Problem Description
有一个无限大的矩形,初始时你在左上角(即第一行第一列),每次你都可以选择一个右下方格子,并瞬移过去(如从下图中的红色格子能直接瞬移到蓝色格子),求到第
n
行第
m
列的格子有几种方案,答案对
1000000007
取模。
![http://acm.hdu.edu.cn/data/images/C702-1003-1.jpg](http://acm.hdu.edu.cn/data/images/C702-1003-1.jpg)
![http://acm.hdu.edu.cn/data/images/C702-1003-1.jpg](http://acm.hdu.edu.cn/data/images/C702-1003-1.jpg)
Input
多组测试数据。
两个整数 n,m(2≤n,m≤100000)
两个整数 n,m(2≤n,m≤100000)
Output
一个整数表示答案
Sample Input
4 5
Sample Output
10
答案是C(n+m-4,n-2),然后就是随便搞了。
#include<map> #include<set> #include<queue> #include<stack> #include<cmath> #include<cstdio> #include<bitset> #include<string> #include<vector> #include<cstring> #include<iostream> #include<algorithm> #include<functional> using namespace std; typedef long long LL; const int low(int x) { return x&-x; } const int INF = 0x7FFFFFFF; const int mod = 1e9 + 7; const int maxn = 2e5 + 10; int n, inv[maxn],c[maxn],b[maxn],m; //C(n+m-4,m-2); int main() { b[1]=b[0]=c[1]=c[0]=1; inv[1]=1; for (int i=2;i<maxn;i++) { inv[i]=(LL)inv[mod%i]*(mod-mod/i)%mod; c[i]=(LL)c[i-1]*i%mod; b[i]=(LL)b[i-1]*inv[i]%mod; } while (~scanf("%d%d",&n,&m)) { printf("%d\n",(int)((LL)c[n+m-4]*b[m-2]%mod*b[n-2]%mod)); } return 0; }