您的位置:首页 > 其它

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

2017-09-24 18:52 375 查看
题目传送门

对于这题,我只能说,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 double
using 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: