洛谷 P2265 路边的水沟
题目
题目背景
LYQ市有一个巨大的水沟网络,可以近似看成一个n*m的矩形网格,网格的每个格点都安装了闸门,我们将从水沟网络右下角的闸门到左上角的闸门的一条路径称为水流。
题目描述
现给定水沟网的长和宽,求该水沟网中所有只包含向左和向上移动的水流数量。
输入输出格式
输入格式:
输入共1行,包含两个整数n和m。
输出格式:
输出一个数字ans,即水流的数量。由于答案可能很大,请输出答案对1000000007取模的结果。
输入输出样例
输入样例#1:
3 5
输出样例#1:
56
说明
对于30%的数据,1 ≤ m,n ≤ 10。
对于50%的数据,1 ≤ m,n ≤ 1,000。
对于80%的数据,1 ≤ m,n ≤ 50,000。
对于100%的数据,1 ≤ m,n ≤ 1,000,000。
题解
从一个 n∗m 的格子图的左上角到右下角(或从右下角到左下角),且只能向右下走(或向左上走)的方案数即为在 n+m 步里找出n步往下(或上)走的方案数,即为Cnn+m
代码
using namespace std;
const LL tt=1000000007;
LL a,b;
LL fact[1000005];
LL pow(LL x,LL n,LL p)
{
LL ret=1;
while (n)
{
if (n&1) ret=(ret*x)%p;
x=(x*x)%p;
n>>=1;
}
return ret;
}
int main()
{
scanf("%lld%lld",&a,&b);
fact[0]=1;
for (LL i=1;i<=a+b;i++) fact[i]=fact[i-1]*i%tt;
printf("%lld",fact[a+b]*pow(fact[a]*fact[b]%tt,tt-2,tt)%tt);
return 0;
}