[51nod-1120]机器人走方格V3 题解

来源:互联网 发布:java 设置useragent 编辑:程序博客网 时间:2024/04/30 09:20

题目传送门
对于这题,我只能说,Lucas大法好,还有就是对于求上三角和下三角的方案数,基本跟卡特兰树有关。

#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>#define rep(i,a,n) for (int i=a;i<=n;i++)#define per(i,a,n) for (int i=a;i>=n;i--)#define Clear(a,x) memset(a,x,sizeof(a))#define ll long long#define INF 2000000000#define eps 1e-8#define db doubleusing namespace std;int read(){    int x=0,f=1;    char ch=getchar();    while (ch<'0'||ch>'9') f=ch=='-'?-1:f,ch=getchar();    while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();    return x*f;}const int mod=10007;int n;ll exgcd(ll a,ll b,ll &x,ll &y){    if (b==0){        x=1;        y=0;        return a;    }    ll d=exgcd(b,a%b,x,y);    ll tmp=x;    x=y;y=tmp-(a/b)*y;    return d;}ll C(ll x,ll y){    ll x1=1,y1=1;    per(i,x,y+1) x1*=i,x1%=mod;    rep(i,2,y) y1*=i,y1%=mod;    ll x2=0,y2=0;    exgcd(y1,mod,x2,y2);    while (x2<0) x2+=mod;    return x1*x2%mod;}ll lucas(ll n,ll m){    return m==0?1:C(n%mod,m%mod)*lucas(n/mod,m/mod)%mod;}int main(){    while (~scanf("%d",&n)){        n--;        ll d1,d2;        ll x=lucas(2*n,n);        ll d=exgcd(n+1,mod,d1,d2);        while (d1<0) d1+=mod;        printf("%lld\n",2*x*d1%mod);        }    return 0;}
原创粉丝点击