51Nod1120 机器人走方格 V3

题目看这里

一个数学题,答案就是卡特兰数*2

求卡特兰数要用到组合数求法f[n]=C(2n-2,n-1)/n

由于模数较小,可以Lucas定理直接做,但是这样是有问题的因为n不一定和模数互质,但是还是A了,数据比较水

#pragma GCC opitmize("O3")
#pragma G++ opitmize("O3")
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define LL long long
#define M 10007 
using namespace std;
LL js[M],inv[M]; int n;
inline LL pow(LL x,LL k,LL s=1){
    for(;k;x=x*x%M,k>>=1) k&1?s=s*x%M:0;
    return s;
}
inline LL C(int n,int m){ return js[n]*inv[m]%M*inv[n-m]%M; }
inline LL Lucas(int n,int m){
    return m?C(n%M,m%M)*Lucas(n/M,m/M):1;
}
int main(){
    scanf("%d",&n); 
    for(int i=*js=1;i<M;++i) js[i]=js[i-1]*i%M;
    inv[M-1]=pow(js[M-1],M-2);
    for(int i=M-1;i;--i) inv[i-1]=inv[i]*i%M;
    printf("%lld\n",Lucas(n-1<<1,n-1)*pow(n,M-2)%M*2%M);
}

转载于:https://www.cnblogs.com/Extended-Ash/p/9477096.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值