我是靠谱客的博主 烂漫飞鸟,最近开发中收集的这篇文章主要介绍51nod 1120 机器人走方格 V3 【卡特兰数+卢卡斯定理+组合数】,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

…我并不知道为什么事卡特兰数,反正用dp打的表就是卡特兰数,因为是两个三角所以再乘个2
卡特兰数使用( h(n)=frac{C_{2n}^{n}}{n+1} )因为范围比较大所以组合数部分用卢卡斯定理来求。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
const int mod=10007,N=10020;
int n,fac[N],inv[N];
int ksm(int a,int b)
{
    a=a%mod;
    int r=1;
    while(b)
    {
        if(b&1)
            r=r*a%mod;
        a=a*a%mod;
        b>>=1;
    }
    return r;
}
int C(int n, int m)
{
    if(n<m)
        return 0;
    return fac[n]*inv[m]%mod*inv[n-m]%mod;
}
int lucas(int n,int m)
{
    return m==0?1:C(n%mod,m%mod)*lucas(n/mod,m/mod)%mod;
}
int main()
{
    fac[0]=1;
    for(int i=1;i<mod;i++)
        fac[i]=fac[i-1]*i%mod;
    inv[mod-1]=ksm(fac[mod-1],mod-2);
    for(int i=mod-2;i>=0;i--)
        inv[i]=inv[i+1]*(i+1)%mod;
    scanf("%d",&n);
    n--;
    printf("%dn",(lucas(n<<1,n)+mod-lucas(n<<1,n-1))%mod*2%mod);
    return 0;  
}

转载于:https://www.cnblogs.com/lokiii/p/8336654.html

最后

以上就是烂漫飞鸟为你收集整理的51nod 1120 机器人走方格 V3 【卡特兰数+卢卡斯定理+组合数】的全部内容,希望文章能够帮你解决51nod 1120 机器人走方格 V3 【卡特兰数+卢卡斯定理+组合数】所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(51)

评论列表共有 0 条评论

立即
投稿
返回
顶部