Hdu 5698 瞬间移动【组合+逆元】

33 篇文章 0 订阅
15 篇文章 0 订阅


瞬间移动

Problem Description

有一个无限大的矩形,初始时你在左上角(即第一行第一列),每次你都可以选择一个右下方格子,并瞬移过去(如从下图中的红色格子能直接瞬移到蓝色格子),求到第nn行第mm列的格子有几种方案,答案对10000000071000000007取模。

https://i-blog.csdnimg.cn/blog_migrate/6be27c7c8f0609e142553195f49b804c.jpeg

Input

多组测试数据。

两个整数n,m(2\leq n,m\leq 100000)n,m(2n,m100000)

Output

一个整数表示答案

Sample Input
4 5
Sample Output
10

Source


题意:

手动尝试几组数据,会发现其实就是杨辉三角,也就是组合问题,

不过在求解的时候,涉及到除法运算,求模运算不支持除法,因此用逆元进行处理....

求n的组合数(第n行的杨辉三角数)的递推式为:


c[0]=1;

c[i]=c[i-1]*(n-i+1)/i  (1<=i<=n)


/*
http://blog.csdn.net/liuke19950717
*/
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const ll maxn=1000005;
const ll mod=1000000007;
ll x[maxn];
void extgcd(ll a,ll b,ll &x, ll &y)
{
    if(!b)
    {
        x=1;y=0;
        return;
    }
    extgcd(b,a%b,y,x);
    y-=(a/b)*x;
}
ll inv(ll a,ll n)
{
    ll x,y;
    extgcd(a,n,x,y);
    return (x+n)%n;
}
int main()
{
    ll n,m;
    while(~scanf("%lld%lld",&n,&m))
    {
        memset(x,0,sizeof(x));
        ll s=n+m-4;
        x[0]=1;
        for(ll i=1;i<=s;++i)
        {
        	x[i]=(x[i-1]*(s-i+1))%mod;
        	x[i]=(x[i]*inv(i,mod))%mod;
        }
        printf("%I64d\n",x[m-2]);
    }
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值