• 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感觉可以预处理一下前缀和

  • 相关阅读:
    redis持久化RDB与AOF
    oracle PL/SQL习题
    pl/sql中的三种循环
    转 Oracle Cursor用法总结
    Oracle与MySQL的SQL语句区别
    安装mysql 遇到最后一步卡死解决方案
    Oracle安装
    mysql安装
    sql语句的优先级
    MVC设计模式
  • 原文地址:https://www.cnblogs.com/dancer16/p/7600200.html
Copyright © 2020-2023  润新知