51Nod 机器人走方格 V3 —— 卡特兰数、Lucas定理
题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1120


题解:
1.看到这种题,马上就想到了卡特兰数。但卡特兰数最快也要O(n)的时间复杂度去递推或者预处理,而n的范围是1e9,所以行不通。但发现Mod的值为10007,感觉突破口在里头,但没有头绪。
2.后来发现了Lucas定理:
C(n,m)%p=C(n/p,m/p)*C(n%p,m%p)%p,p为素数
这个式子大大缩小了n的范围,因此就可以直接上卡特兰数的公式了:
h(n) = C(2n,n) - C(2n,n+1),n=0,1,2...
代码如下:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <string>
#include <set>
using namespace std;
typedef long long LL;
const int INF = 2e9;
const LL LNF = 9e18;
//const int MOD = 1e9+7;
const int MAXN = 1e6+; const int MOD = ;
int qpow(int x, int y)
{
int s = ;
while(y)
{
if(y&) s = (s*x)%MOD;
x = (x*x)%MOD;
y >>= ;
}
return s;
} int A[*MOD+], inv[*MOD+];
int C(int n, int m)
{
if(n<m) return ;
return (((A[n]*inv[n-m])%MOD)*inv[m])%MOD;
} int lacus(int n, int m)
{
int s = ;
while(n&&m)
{
s = (s*C(n%MOD,m%MOD))%MOD;
n /= MOD;
m /= MOD;
}
return s;
} void init()
{
A[] = inv[] = ;
for(int i = ; i<=*MOD; i++)
{
A[i] = (i*A[i-])%MOD;
inv[i] = qpow(A[i],MOD-);
}
} int main()
{
init();
int n;
while(scanf("%d",&n)!=EOF)
{
n--;
int ans = (lacus(*n,n)-lacus(*n,n+)+MOD)%MOD;
ans = (ans*)%MOD;
printf("%d\n", ans);
}
}
51Nod 机器人走方格 V3 —— 卡特兰数、Lucas定理的更多相关文章
- 51nod 1120 机器人走方格 V3 卡特兰数 lucas定理
N * N的方格,从左上到右下画一条线.一个机器人从左上走到右下,只能向右或向下走.并要求只能在这条线的上面或下面走,不能穿越这条线,有多少种不同的走法?由于方法数量可能很大,只需要输出Mod 100 ...
- 51nod 1120 机器人走方格V3
1120 机器人走方格 V3 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 收藏 关注 N * N的方格,从左上到右下画一条线.一个机器人从左上走到右下,只 ...
- 51nod1120 机器人走方格 V3
跟括号序列是一样的,将向右走看成是左括号向左走看成是右括号就可以了.那么就是卡特兰数了.然后由于n和m太大所以用了lucas定理 //跟括号序列是一样的,将向右走看成是左括号向左走看成是右括号就可以了 ...
- 1120 机器人走方格 V3
1120 机器人走方格 V3 基准时间限制:1 秒 空间限制:131072 KB N * N的方格,从左上到右下画一条线.一个机器人从左上走到右下,只能向右或向下走.并要求只能在这条线的上面或下面走, ...
- 机器人走方格 V3
1120 . 机器人走方格 V3 基准时间限制:1 秒 空间限制:65536 KB 分值: 160 N * N的方格,从左上到右下画一条线.一个机器人从左上走到右下,只能向右或向下走.并要求只能在 ...
- 51nod 1120 机器人走方格 V3 【卡特兰数+卢卡斯定理+组合数】
-我并不知道为什么事卡特兰数,反正用dp打的表就是卡特兰数,因为是两个三角所以再乘个2 卡特兰数使用\( h(n)=\frac{C_{2n}^{n}}{n+1} \)因为范围比较大所以组合数部分用卢卡 ...
- 51nod 1120 机器人走方格 V3
N * N的方格,从左上到右下画一条线.一个机器人从左上走到右下,只能向右或向下走. 并要求只能在这条线的上面或下面走,不能穿越这条线,有多少种不同的走法? 由于方法数量可能很大,只需要输出Mod 1 ...
- 51nod_1120:机器人走方格 V3
题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1120 Catalan数 基础题,ans=C(2n-2,n-2 ...
- 1120 机器人走方格 V3(组合数)
题目实际上是求catalan数的,Catalan[n] = C(2*n,n) / (n+1) = C(2*n,n) % mod * inv[n+1],inv[n+1]为n+1的逆元,根据费马小定理,可 ...
随机推荐
- IntelliJ IDEA 识别一个类所属的jar包package
IntelliJ IDEA 识别一个类所属的jar包package 按住ctrl,鼠标移动上去,不要点击: 有木有快捷键? ctrl+alt+B直接就过去了:需要再跳回来:
- merge-sorted-array——合并两个有序数组
Given two sorted integer arrays A and B, merge B into A as one sorted array. Note: You may assume th ...
- C语言八进制和十六进制数
一 赋值 int dex = 100;// 默认十进制 int oct = 0144;// 八进制,以0開始 int hex = 0x64;// 十六进制,以0x開始 二 输出 void show(i ...
- [Flex][Adobe Flash Builder 4.6]谷歌浏览器(Chrome)下运行Flex程序的问题
今天刚开始学习Flex,发现用Chrome运行程序时会一片空白,上网查了相关资料后找到了解决方法: 打开Chrome,在地址栏输入:chrome://plugins/ 进入插件管理界面,查找Fla ...
- Win 8.1 安装后要做的优化
①无光驱恢复电脑或重置系统(无需插入介质,本来老提示插入介质) 1.准备工作:win8iso,解压到任意非系统盘,解压后的路径假如是:H:\OS\win8 2.接着以管理员身份启动命令提示符,输入 ...
- java中类型的隐式转换
byte+byte=int,低级向高级是隐式类型转换,高级向低级必须强制类型转换,byte<char<short<int<long<float<double
- 常用js特效
事件源对象 event.srcElement.tagName event.srcElement.type 捕获释放 event.srcElement.setCapture(); event.sr ...
- 史上最浅显易懂的Git教程3 分支管理
假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活了.如果等代码全部写完再一次提交,又存在丢失每天进度的巨大风险 ...
- JDK设置Encoding编码格式
执行JAVA程序报错内容如下: java.lang.IllegalStateException: The Java Virtual Machine has not been configured to ...
- 【转】android 签名验证防止重打包
网上资料很多,这里只做一个笔记反编译 dex 修改重新打包签名后 apk 的签名信息肯定会改变,所以可以在代码中判断签名信息是否被改变过,如果签名不一致就退出程序,以防止 apk 被重新打包. 1 j ...