51Nod1120 - 机器人走方格 V3 - 组合数+卡特兰数+Lucas定理
思路
为什么用到了Lucas定理?
因为n很大,但是mod却只有10007这么大。
参考博客:
Lucas定理
参考博客:
求组合,并且数据比较大,需要用到 Lucas 定理。
适用领域范围:大组合数求模。
Lucas定理是用来求: , 为素数的值。
卡特兰数
对于求上三角和下三角的方案数,基本跟卡特兰数有关。
AC代码
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
#include<map>
#include<cmath>
#include<queue>
using namespace std;
typedef long long ll;
#define inf 0x3f3f3f3f
const ll mod=10007;
ll niyuan[10010];
ll ksm(ll x,int nn) // **快速幂写错了
{
ll res=1;
while(nn)
{
if(nn&1)
res=res*x%mod;
x=x*x%mod;
nn>>=1;
}
return res;
}
ll C(ll m,ll n) // 求组合
{
if(n>m) return 0;
ll x=1;
for(int i=1;i<=n;i++)
x=x*(m-i+1)%mod*niyuan[i]%mod;
return x;
}
ll Lucas(ll n,ll m) //Lucas定理
{
if(m==0) return 1;
return Lucas(n/mod,m/mod)%mod*C(n%mod,m%mod)%mod;
}
ll w(ll n)
{
ll q=Lucas(2*n,n)%mod;
ll x=ksm(n+1,mod-2);
q=(q%mod*x%mod)%mod;
return q*2%mod;
}
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=mod;i++)
niyuan[i]=ksm(i,mod-2); //预处理求逆元
ll ans=w(n-1);
printf("%lld\n",ans);
return 0;
}
分类:
数论
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
2019-10-15 求回文串的个数-中心扩展法
2019-10-15 CodeForces-1215C-Swap Letters-思维