瞬间移动
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 1469 Accepted Submission(s): 705
题目链接:点击打开链接
Problem Description
有一个无限大的矩形,初始时你在左上角(即第一行第一列),每次你都可以选择一个右下方格子,并瞬移过去(如从下图中的红色格子能直接瞬移到蓝色格子),求到第
n
行第
m
列的格子有几种方案,答案对
1000000007
取模。
Input
多组测试数据。
两个整数 n,m(2≤n,m≤100000)
分析:
两个整数 n,m(2≤n,m≤100000)
分析:
第一点。试着推一下会发现他是杨辉三角,
0 0 0 0 0
0 1 1 1 1
0 1 2 3 4
0 1 3 6 10
0 1 4 10 20(二项式系数)找规律。
或者首先我们分析一下这个题其实就是我们要从(1,1)点走到(n, m)点,而且只能走右下方,那么我们就相当于从(n-2+m-2)个格子里选n-2(或者是m-2,都一样)个格子,因为我们得去掉n-1行和m-1列(这个不能选),然后再去掉第一行和第一列.
#include <iostream>
using namespace std;
typedef long long LL;
const LL MOD = 1000000007;
void exgcd(LL a, LL b, LL &x, LL &y)
{
if(b == 0)
{
x = 1;
y = 0;
return;
}
LL x1, y1;
exgcd(b, a%b, x1, y1);
x = y1;
y = x1-(a/b)*y1;
}
int main()
{
LL n, m;
while(cin>>n>>m)
{
LL ans = 1;
for(LL i=1; i<=n+m-4; i++)
ans = (ans*i)%MOD;
for(LL i=1; i<=n-2; i++)
{
LL x, y;
exgcd(i, MOD, x, y);
x = (x%MOD+MOD)%MOD;
ans = (ans*x)%MOD;
}
for(LL i=1; i<=m-2; i++)
{
LL x, y;
exgcd(i, MOD, x, y);
x = (x%MOD+MOD)%MOD;
ans = (ans*x)%MOD;
}
ans = (ans%MOD+MOD)%MOD;
cout<<ans<<endl;
}
return 0;
}