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;
	
}
posted @ 2022-03-31 16:19  白木偶君  阅读(40)  评论(0编辑  收藏  举报