题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5673

分析:

  这道题是一道裸的默慈金数,比较容易想到的是用卡特兰数来做。不了解的可以先学习一下。

  卡特兰数:http://www.cnblogs.com/yaoyueduzhen/p/5456490.html

  默慈金数:http://www.cnblogs.com/yaoyueduzhen/p/5456530.html

  记路径长度为nn,那么机器人最多向右走⌊​n/2​​⌋步并向左走⌊​n/2​​⌋步。

      Ans(n)=∑C​(n,​2i)​​ Catalan(i)

  其中 C(n,2i) 表示从n个物品中取2*i个的组合数,Catalan(n)表示第n个卡特兰数,0 <= i <= ⌊​n/2​​⌋

  基于n的取值范围,此题可以预处理出1,000,001以内的乘法逆元、卡特兰数。

  每次询问,都可以递推组合数,或者提前一次性预处理好阶乘和阶乘的逆元得到组合数;累加组合数与相应卡特兰数的乘积,得到答案。

  事实上,Ans(n)是第n个默慈金数,利用递推公式可以快速求出。

卡特兰数代码:

 #include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring> using namespace std;
const long long mod=;
long long n;
long long ans[],ni[]; long long power(long long a,long long n,long long m)
{
long long ans=,tmp=a;
while(n)
{
if(n&)
ans=ans*tmp%m;
tmp=tmp*tmp%m;
n=n>>;
}
return ans%m;
} void init()
{
ans[]=;
ans[]=;
for(long long i=;i<=;i++)
ni[i]=power(i,mod-,mod)%mod;
for(long long i=;i<=;i++)
ans[i]=(*i-)%mod*ans[i-]%mod*ni[i+]%mod;
} int main()
{
init();
int T;
scanf("%d",&T);
while(T--)
{
scanf("%lld",&n);
long long res=,tmp=;
for(long long i=;i*<=n;i++)
{
res=(res+tmp*ans[i]%mod)%mod;
tmp=tmp*(n-*i)%mod*(n-*i-)%mod*ni[*i+]%mod*ni[*i+]%mod;
}
cout<<res<<endl;
}
return ;
}

默慈金数代码:

 #include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring> using namespace std; const long long mod=;
long long n;
long long ans[];
long long power(long long a,long long n,long long m)
{
long long ans=,tmp=a;
while(n)
{
if(n&)
ans=ans*tmp%m;
tmp=tmp*tmp%m;
n=n>>;
}
return ans;
} int main()
{
ans[]=;
ans[]=;
for(long long i=;i<=;i++)
ans[i+]=((*i+)%mod*ans[i]%mod+*i*ans[i-]%mod)%mod*power(i+,mod-,mod)%mod;
int T;
scanf("%d",&T);
while(T--)
{
scanf("%lld",&n);
cout<<ans[n]<<endl;
}
return ;
}

  

hdu5673 Robot 卡特兰数 / 默慈金数的更多相关文章

  1. 51nod1556 计算(默慈金数)

    Problem 有一个\(1*n\)的矩阵,固定第一个数为\(1\),其他填正整数, 且相邻数的差不能超过\(1\),求方案数. \(n\le 10^6\) Solution 容易发现答案是\(f_n ...

  2. HDU5673 Robot 默慈金数

    分析: 注:然后学了一发线性筛逆元的姿势 链接:http://blog.miskcoo.com/2014/09/linear-find-all-invert #include<iostream& ...

  3. 51 Nod 1556计算(默慈金数的应用)

    #include<bits/stdc++.h> #define mod 1000000007 using namespace std; typedef long long ll; ll m ...

  4. hdu-5673 Robot(默次金数)

    题目链接: Robot Time Limit: 12000/6000 MS (Java/Others)  Memory Limit: 65536/65536 K (Java/Others) 问题描述 ...

  5. hdu5673 Robot 卡特兰数+组合数学+线性筛逆元

    Robot Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Subm ...

  6. Python 素数判断;以及默尼森数

    1. 素数/质数 只能被2或者本身整除的正整数. 2. 默尼森数 P是素数且M也是素数,并且满足等式M=2^P-1,则称M为默尼森数. 编程小要求: 输出前5个默尼森数 1)最外层循环找素数 中间层循 ...

  7. Python实现的寻找前5个默尼森数算法示例

    Python实现的寻找前5个默尼森数算法示例 本文实例讲述了Python实现的寻找前5个默尼森数算法.分享给大家供大家参考,具体如下: 找前5个默尼森数. 若P是素数且M也是素数,并且满足等式M=2* ...

  8. Spring boot中最大连接数、最大线程数与最大等待数在生产中的异常场景

    在上周三下午时,客户.业务和测试人员同时反溃生产环境登录进入不了系统,我亲自测试时,第一次登录进去了,待退出后再登录时,复现了客户的问题,场景像是请求连接被拒绝了,分析后判断是spring boot的 ...

  9. 使用GetLogicalProcessorInformation获取逻辑处理器的详细信息(NUMA节点数、物理CPU数、CPU核心数、逻辑CPU数、各级Cache)

    不过必须XP SP3以上才行.所有API大全: https://msdn.microsoft.com/en-us/library/windows/desktop/aa363804(v=vs.85).a ...

随机推荐

  1. sqlserver提高篇

    Microsoft SQL Server2008复习提高 一.Microsoft SQL Server 系统的体系结构 1.Microsoft SQL Server2008由4个主要的部分组成,即4个 ...

  2. 导入 theano 失败。“cannot import name gof”

    按照网上教程安装好了 theano 之后,import theano 出现错误."cannot import name gof".网上找了很多教程,都不可行.最后找到如下教程.亲测 ...

  3. RxSwift 实战操作【注册登录】

    前言 看了前面的文章,相信很多同学还不知道RxSwift该怎么使用,这篇文件将带领大家一起写一个 注册登录(ps:本例子采用MVVM)的例子进行实战.本篇文章是基于RxSwift3.0写的,采用的是C ...

  4. (转)java.util.Scanner应用详解

    java.util.Scanner应用详解   java.util.Scanner是Java5的新特征,主要功能是简化文本扫描.这个类最实用的地方表现在获取控制台输入,其他的功能都很鸡肋,尽管Java ...

  5. Java并发编程——线程安全及解决机制简介

    简介: 本文主要介绍了Java多线程环境下,可能会出现的问题(线程不安全)以及相应的解决措施.通过本文,你将学习到如下几块知识: 1. 为什么需要多线程(多线程的优势) 1. 多线程带来的问题—线程安 ...

  6. 9.Spark Streaming

    Spark Streaming 1 Why Apache Spark 2 关于Apache Spark 3 如何安装Apache Spark 4 Apache Spark的工作原理 5 spark弹性 ...

  7. python3网络编程之socketserver

    本节主要是讲解python3网络编程之socketserver,在上一节中我们讲到了socket.由于socket无法支持多用户和多并发,于是就有了socket server. socket serv ...

  8. python cookbook第三版学习笔记十三:类和对象(三)描述器

    __get__以及__set__:假设T是一个类,t是他的实例,d是它的一个描述器属性.读取属性的时候T.d返回的是d.__get__(None,T),t.d返回的是d.__get__(t,T).说法 ...

  9. docke镜像上传到dockerhub仓库和阿里云docker仓库的方法

    操作指南   1.  登录阿里云docker registry: $ sudo docker login --username=linjiaxin897591495 registry.cn-hangz ...

  10. 安徽省2016“京胜杯”程序设计大赛_H_单身晚会

    单身晚会 Time Limit: 1000 MS Memory Limit: 65536 KB Total Submissions: 53 Accepted: 16 Description ​ZJ和Z ...