1. 程式人生 > 其它 >51nod 1120 機器人走方格 V3 |盧卡斯定理+卡特蘭數列

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;
	
}