hdu_5698_瞬间移动

Posted 会飞的雅蠛蝶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdu_5698_瞬间移动相关的知识,希望对你有一定的参考价值。

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

技术分享图片

Input多组测试数据。

两个整数n,m(2n,m100000)n,m(2≤n,m≤100000)
Output一个整数表示答案Sample Input

4 5

Sample Output

10

卢卡斯定理解杨辉三角 杨辉三角第n行的m个数可表示为C(n-1,m-1)
Lucas定理是用来求 C(n,m) mod p,p为素数的值,用来解决大组合数求模是很有用的。最大的数据处理能力是p在10^5左右。
C(n,m) = C(n-1,m-1) + C(n-1,m).



#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define ll long long
const ll mod=1000000007;
#define maxn 70
ll pow(ll a,ll n,ll mod)
{
    ll base=a,ret=1;
    while(n)
    {
        if(n&1) ret=(ret*base)%mod;
        base=(base*base)%mod;
        n>>=1;
    }
    return ret%mod;
}
ll C(ll n,ll k,ll p)
{
    if(k==n)
        return 1;
    if(n-k<k)
            k=n-k;
        ll ans=1;
        for(ll i=1;i<=k;i++)
        {
            ans=ans*(n-i+1)%p*pow(i,mod-2,p)%p;
        }
        return ans;
}
ll lucas(ll n,ll m,ll p)
{
    if(m==0)
        return 1;
    return C(n%p,m%p,p)*lucas(n/p,m/p,p)%p;
}

int main()
{
    ll n,m;
    while(~scanf("%lld%lld",&n,&m))
    {
        cout<<lucas(m+n-4,m-2,mod)<<endl;
    }
}

  













以上是关于hdu_5698_瞬间移动的主要内容,如果未能解决你的问题,请参考以下文章

hdu-5698 瞬间移动(数论+快速幂)

hdu5698瞬间移动(杨辉三角+快速幂+逆元)

hdu 5698 瞬间移动(2016"百度之星" - 初赛(Astar Round2B)——数学题)

HDU 5698 瞬间移动 (2016"百度之星" - 初赛(Astar Round2B) 1003)

HDU 5698 大组合数取模(逆元)

HDU - 5698