51nod 1120 机器人走方格V3(组合数学+卡特兰数+Lucas)
来源:互联网 发布:华为交换机端口看光功 编辑:程序博客网 时间:2024/04/30 12:47
Description
N * N的方格,从左上到右下画一条线。一个机器人从左上走到右下,只能向右或向下走。并要求只能在这条线的上面或下面走,不能穿越这条线,有多少种不同的走法?由于方法数量可能很大,只需要输出Mod 10007的结果。
Input
输入一个数N(2 <= N <= 10^9)。
Output
输出走法的数量 Mod 10007。
Input示例
4
Output示例
10
解题思路
参照博客学习http://blog.csdn.net/hackbuteer1/article/details/7450250
类比于第一个题目,可以将横着类比为0,竖着走类比为1,很明显的卡特兰数的应用。但是由于n太大,需要使用Lucas定理来求组合数
lucas(n,m,p)=lucas(n/p,m/p,p)*C(n%p,m%p,p),
lucas(n,0,p)=1。
代码实现
#include<bits/stdc++.h>using namespace std;#define ll long longconst ll p=10007;ll quick_pow(ll a,ll b){ ll ans=1; a%=p; while(b>0) { if(b%2) ans=ans*a%p; a=a*a%p; b/=2; } return ans;}ll calc(int n,int m){ ll a=1,b=1; if(m>n) return 0; while (m) { a=a*n%p; b=b*m%p; n--; m--; } return a*quick_pow(b,p-2)%p;}ll lucas(ll n,ll m){ if(m==0) return 1; return calc(n%p,m%p)*lucas(n/p,m/p)%p;}int main(){ ios::sync_with_stdio(false); ll n; cin>>n; ll ans=lucas(2*n-2,n-1)%p*quick_pow(n,p-2)%p*2%p; cout<<ans<<endl; return 0;}
阅读全文
0 0
- 51nod 1120 机器人走方格V3(组合数学+卡特兰数+Lucas)
- 51nod 1120 机器人走方格 V3(卡特兰数,lucas定理)
- 51nod 1120 机器人走方格 V3 lucas+卡特兰+逆原 好题
- 51nod 1120 机器人走方格V3 卡特兰数+卢卡斯定理
- 51nod 1120 机器人走方格V3【卡特兰数】【卢卡斯定理】
- 51node-1120 机器人走方格(卡特兰数列+Lucas定理)
- 51nod 1118 机器人走方格(组合数学)
- 51nod 1120 机器人走方格v3
- 51nod 1120 机器人走方格 V3
- 【51 Nod】 1120 机器人走方格 V3
- 51Nod-1120-机器人走方格 V3
- 2017-10-22 51nod 1120 卢卡斯定理 Lucas 组合数取模 卡特兰数
- 51nod-1119 机器人走方格(组合数学,离散数学)
- 51Nod 1119 机器人走方格 组合数学
- 51 NOD 1119 机器人走方格 V2(Lucas)
- [51nod-1120]机器人走方格V3 题解
- 51nod 1118 机器人走方格(组合数【逆元】,dp)
- 51nod1119 机器人走方格 组合数学
- c++学习笔记导航
- 推荐系统杂谈
- VS2017控制台程序显示中文为乱码的问题解决办法
- RadASM资源链接错误RC2104及找不到resource.h解决方案
- java中对多态的理解
- 51nod 1120 机器人走方格V3(组合数学+卡特兰数+Lucas)
- Java入门到精通
- PREV-6 翻硬币
- Machine Learning A Probabilistic Perspective 笔记
- Wannafly挑战赛4 C 割草机
- 【JavaScript】var a = b = 3;是如何执行的?
- PREV-5 错误票据
- UGUI研究院之Prefab嵌套特效部分(二十九)
- 用 Python 解方程