lucas+卡特兰数
N * N的方格,从左上到右下画一条线。一个机器人从左上走到右下,只能向右或向下走。并要求只能在这条线的上面或下面走,不能穿越这条线,有多少种不同的走法?由于方法数量可能很大,只需要输出Mod 10007的结果。
经典的卡特兰数模型,只要取模时+一个lucas就行了:模数较小时一般采用lucas定理,很好懂
#include<iostream> #include<cstdio> #include<algorithm> #define p 10007 using namespace std; #define ll long long ll n; ll pow(ll a,ll b,ll pp) { ll tmp=a,ans=1ll; while(b) { if(b%2) { ans=ans*tmp%p; } tmp=tmp*tmp%p; b>>=1; } return ans; } ll C(ll n,ll m) { if(n<m) return 0; ll ans=1; for (ll i=1;i<=m;++i){ ll a=(n+i-m)%p; ll b=i%p; ans=ans*(a*pow(b,p-2,p)%p)%p; } return ans; } ll lucas(ll a,ll b) { if(b==0) return 1; return lucas(a/p,b/p)*C(a%p,b%p)%p; } int main(){ scanf("%lld",&n); n--; printf("%lld",(lucas(2*n,n)*pow(n+1,p-2,p)%p*2)%p); }
这里面的C感觉可以预处理一下前缀和