1. 程式人生 > >HDU 5698-瞬間移動

HDU 5698-瞬間移動

第一點。試著推一下會發現他是楊輝三角,

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