51nod 1120 機器人走方格 V3 |盧卡斯定理+卡特蘭數列
阿新 • • 發佈:2022-03-31
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; }