【51Nod1120】机器人走方格 V3

来源:互联网 发布:windows 桌面版qq 编辑:程序博客网 时间:2024/04/30 08:34

N * N的方格,从左上到右下画一条线。一个机器人从左上走到右下,只能向右或向下走。并要求只能在这条线的上面或下面走,不能穿越这条线,有多少种不同的走法?由于方法数量可能很大,只需要输出Mod 10007的结果。
Input
输入一个数N(2 <= N <= 10^9)。
Output
输出走法的数量 Mod 10007。
Input示例
4
Output示例
10

题解
找规律发现卡特兰数C(2n,n)-C(2n,n-1)

代码

#include<iostream>#include<cstdio>#include<cstring>#include<cstdlib>#include<set>#include<ctime>#include<vector>#include<cmath>#include<algorithm>#include<map>#define mod 10007 #define ll long long  using namespace std;inline ll read(){    ll x=0LL,f=1LL;char ch=getchar();    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}    return x*f;}int fac[mod+5],inv[mod+5],n;void pre(){    fac[0]=inv[0]=inv[1]=1;      for (int i=1;i<mod;i++) fac[i]=fac[i-1]*i%mod;    for (int i=2;i<mod;i++) inv[i]=inv[mod%i]*(mod-mod/i)%mod;    for (int i=1;i<mod;i++) inv[i]=inv[i-1]*inv[i]%mod;}int C(int n,int m){    if (n<m) return 0;    return fac[n]*inv[m]%mod*inv[n-m]%mod;}int lucas(int n,int m){    int ret=1;    while (n||m)    {        ret=ret*C(n%mod,m%mod)%mod;        n/=mod;m/=mod;    }    return ret;}int main(){    n=read();n--;pre();    printf("%d",(lucas(2*n,n)-lucas(2*n,n-1)+mod)%mod*2%mod);    return 0;}