HDU 5698-瞬间移动

瞬间移动

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(2n,m100000)




分析:

第一点。试着推一下会发现他是杨辉三角,

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 
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<











你可能感兴趣的:(ACM-数学)