1120 机器人走方格 V3
2016-07-17 10:36
323 查看
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了。
基准时间限制: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 10007 ll 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; }
相关文章推荐
- EnumMap类源码解析
- 【记录一下】phpMyAdmin 4.5.0-beta1 发布,要求 PHP 5.5
- linux shell 编程(三)
- Java之Scanner(二)
- 设计模式---结构类型---桥接
- Oracle的使用经验
- linux菜鸟学习(六)----linux文件属性详解
- java GUI布局与设置背景
- 如何利用photoshop来测量某个元素的宽高
- Ubuntu16.04系统配置.net core环境
- ACM HDU Elevator 电梯
- 《JAVA NIO》第二章缓冲区
- Ubuntu 14 添加Windows风格的底部任务栏
- linux shell 编程(二)
- Java学习三(eclipse的配置)
- 35. Search Insert Position
- java动态代理反射剖析
- WCDMA系统中的功率控制分类
- Pictures of Ascii Art
- 贝叶斯公式的背后