http://acm.hdu.edu.cn/showproblem.php?pid=5698
有一个无限大的矩形,初始时你在左上角(即第一行第一列),每次你都可以选择一个右下方格子,并瞬移过去(如从下图中的红色格子能直接瞬移到蓝色格子),求到第nn行第mm列的格子有几种方案,答案对10000000071000000007取模。
Input
多组测试数据。
两个整数n,m(2≤n,m≤100000)n,m(2≤n,m≤100000)
Output
一个整数表示答案
Sample Input
4 5
Sample Output
10
规律是a[i][j] = a[i-1][j] + a[i][j-1], 可以发现是个斜着的杨辉三角, 根据杨辉三角的通项公式C(m,i),
可以得出C(m+n-2, n-1)
涉及到除法取余就inv吧
#include<bits/stdc++.h>
using namespace std;
using lon = long long;const lon mod= 1e9 + 7;
const lon M = 200005;// m+n 开两倍
lon inv[M], f[M], finv[M];void getinv()
{finv[0] = finv[1] = f[0] = f[1] = inv[0] = inv[1] = 1;for(int i=2; i <= M; i++){f[i] = f[i-1] * i % mod;inv[i]=mod - mod / i * inv[mod%i] % mod;finv[i] = finv[i-1] * inv[i] % mod;}
}lon C(lon a, lon b)
{return f[a] * finv[b] % mod * finv[a-b] % mod;
}int main()
{lon n, m;getinv();while(cin >> n >> m)cout << C(m+n-4, m-2) << endl;return 0;
}