lucas+卡特兰数

N * N的方格,从左上到右下画一条线。一个机器人从左上走到右下,只能向右或向下走。并要求只能在这条线的上面或下面走,不能穿越这条线,有多少种不同的走法?由于方法数量可能很大,只需要输出Mod 10007的结果。

经典的卡特兰数模型,只要取模时+一个lucas就行了:模数较小时一般采用lucas定理,很好懂

#include<iostream>
#include<cstdio>
#include<algorithm>
#define p 10007
using namespace std;
#define ll long long
ll n;
ll pow(ll a,ll b,ll pp)
{
    ll tmp=a,ans=1ll;
    while(b)
    {
        if(b%2)
        {
            ans=ans*tmp%p;
        }
        tmp=tmp*tmp%p;
        b>>=1;
    }
    return ans;
}
ll C(ll n,ll m)
{
    if(n<m) return 0;
    ll ans=1;
    for (ll i=1;i<=m;++i){
        ll a=(n+i-m)%p;
        ll b=i%p;
        ans=ans*(a*pow(b,p-2,p)%p)%p;
  }
  return ans;
}
ll lucas(ll a,ll b)
{
    if(b==0) return 1; 
    return lucas(a/p,b/p)*C(a%p,b%p)%p;
}
int main(){
    scanf("%lld",&n);
    n--;
    printf("%lld",(lucas(2*n,n)*pow(n+1,p-2,p)%p*2)%p);
} 

这里面的C感觉可以预处理一下前缀和

原文地址:https://www.cnblogs.com/dancer16/p/7600200.html