1120 机器人走方格 V3

来源:互联网 发布:金尚网上商城项目源码 编辑:程序博客网 时间:2024/04/30 10:32

1120 机器人走方格 V3
基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题

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

Input

输入一个数N(2 <= N <= 10^9)。

Output

输出走法的数量 Mod 10007。

Input示例

4

Output示例

10
卢卡斯…..依旧用卢卡斯
推导结果是卡特兰数,最后在对应项乘一个2就OK了。

#include<stdio.h>#include<math.h>#include<algorithm>using namespace std;#define ll long long#define mod 10007ll f[mod];ll quickm(ll m,ll n){    ll b=1;    while(n)    {        if(n&1)        b=b*m%mod;        n=n>>1;        m=m*m%mod;    }    return b;}ll Lucas(ll n,ll m){    ll ret=1;    while(n&&m){        ll a=n%mod,b=m%mod;        if(a<b) return 0;        ret=(ret*f[a]*quickm(f[b]*f[a-b]%mod,mod-2))%mod;        n/=mod;        m/=mod;    }    return ret;}int main(){    ll n;    f[0]=1;    for(int i=1;i<mod;i++){        f[i]=f[i-1]*i%mod;    }    //while(~scanf("%lld",&n)!=EOF){        scanf("%lld",&n);        n--;        printf("%lld\n",(ll)Lucas(2*n,n)*quickm(n+1,mod-2)*2%mod);//  }    return 0;}
0 0