[51nod-1120]机器人走方格V3 题解
2017-09-24 18:52
375 查看
题目传送门
对于这题,我只能说,Lucas大法好,还有就是对于求上三角和下三角的方案数,基本跟卡特兰树有关。
对于这题,我只能说,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; }
相关文章推荐
- 51nod 1120 机器人走方格 V3
- 51nod 1120 机器人走方格V3(组合数学+卡特兰数+Lucas)
- 51NOD 1120 机器人走方格 V3(卢卡斯定理 + 非降路径)
- 51nod 1120 机器人走方格 V3
- 51nod 1120 机器人走方格 V3 【卡特兰数+卢卡斯定理+组合数】
- 51Nod-1120-机器人走方格 V3
- 51nod 1120 机器人走方格V3 卡特兰数+卢卡斯定理
- 51nod 1120:机器人走方格 V3
- 51nod 1120 机器人走方格V3【卡特兰数】【卢卡斯定理】
- 51nod 1120 机器人走方格 V3(卡特兰数,lucas定理)
- 51nod 1120 机器人走方格v3
- [卡特兰数] 51Nod 1120 机器人走方格 V3
- 1120 机器人走方格 V3
- 1120 机器人走方格 V3
- 51nod 1120 机器人走方格 V3 卡特兰数 lucas定理
- 51nod 1120 机器人走方格 V3 lucas+卡特兰+逆原 好题
- 1120 机器人走方格 V3
- 【51 Nod】 1120 机器人走方格 V3
- 51nod 机器人走方格 V3
- 51nod 1119 机器人走方格(费马小定理)