51nod 1120 机器人走方格 V3 |卢卡斯定理+卡特兰数列
N * N的方格,从左上到右下画一条线。一个机器人从左上走到右下,只能向右或向下走。并要求只能在这条线的上面或下面走,不能穿越这条线,有多少种不同的走法?由于方法数量可能很大,只需要输出Mod 10007的结果。
输入
输入一个数N(2 <= N <= 10^9)。
输出
输出走法的数量 Mod 10007。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
#include<cstdlib>
#include<algorithm>
using namespace std;
#define int long long
const int N=1e4+5,mod=10007;
int jc[N],inv[N];
inline int ksm(int x,int y){
int ans=1;
while(y){
if(y&1)ans=ans*x%mod;
x=x*x%mod; y>>=1;
}
return ans;
}
inline void pre(int n){
jc[0]=1; for(int i=1;i<=n;i++)jc[i]=jc[i-1]*i%mod;
inv[n]=ksm(jc[n],mod-2);
for(int i=n-1;i>=0;i--)inv[i]=inv[i+1]*(i+1)%mod;
}
inline int C(int x,int y){
if(x<y)return 0;
return jc[x]*inv[x-y]%mod*inv[y]%mod;
}
inline int lucas(int n,int m){
if(!m)return 1;
return C(n%mod,m%mod)*lucas(n/mod,m/mod)%mod;
}
signed main(){
pre(N-1);
int n;
cin>>n;
cout<<2*(lucas((n-1)<<1,n-1)-lucas((n-1)<<1,n-2)+mod)%mod<<endl;
}
不以物喜,不以己悲
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步