51nod 1120 機器人走方格V3【卡特蘭數】【盧卡斯定理】

Description

N * N的方格,從左上到右下畫一條線。一個機器人從左上走到右下,只能向右或向下走。並要求只能在這條線的上面或下面走,不能穿越這條線,有多少種不同的走法?由於方法數量可能很大,只需要輸出Mod 10007的結果。

題解

答案就是H(N1)2

所以就是一個求大組合數模一個質數的題目,可以用盧卡斯定理

(xy)=(x mod py mod p)×xpyp

代碼

#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long
#define tt 10007
using namespace std;
int n,p,f[tt+6],inv[tt+6];
int power(int x,int y){
    int w=x,sum=1;
    while(y){
        if(y&1)sum=(LL)sum*w%tt;
        y>>=1;w=(LL)w*w%tt;
    }
    return sum;
}
int C(int n,int m){
    if(n<tt&&m<tt)return (LL)f[n]*inv[m]%tt*inv[n-m]%tt;
    return (LL)C(n/tt,m/tt)*C(n%tt,m%tt)%tt;
}
int main(){
    freopen("robot.in","r",stdin);
    freopen("robot.out","w",stdout);
    scanf("%d",&n);n--;
    f[0]=1;
    for(int i=1;i<tt;i++)f[i]=(LL)f[i-1]*i%tt;
    inv[tt-1]=power(f[tt-1],tt-2);
    for(int i=tt-2;i>=0;i--)inv[i]=(LL)(inv[i+1]*(i+1))%tt;
    p=power(n+1,tt-2);
    printf("%lld\n",(LL)C(n*2,n)*p%tt*2%tt);
}
發佈了143 篇原創文章 · 獲贊 18 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章