题目链接:https://vjudge.net/problem/HDU-3723

Delta Wave

Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1468    Accepted Submission(s): 483

Problem Description
A delta wave is a high amplitude brain wave in humans with a frequency of 1 – 4 hertz which can be recorded with an electroencephalogram (EEG) and is usually associated with slow-wave sleep (SWS).
-- from Wikipedia

The researchers have discovered a new kind of species called "otaku", whose brain waves are rather strange. The delta wave of an otaku's brain can be approximated by a polygonal line in the 2D coordinate system. The line is a route from point (0, 0) to (N, 0), and it is allowed to move only to the right (up, down or straight) at every step. And during the whole moving, it is not allowed to dip below the y = 0 axis.

For example, there are the 9 kinds of delta waves for N = 4:

Given N, you are requested to find out how many kinds of different delta waves of otaku.

 
Input
There are no more than 20 test cases. There is only one line for each case, containing an integer N (2 < N <= 10000)

 
Output
Output one line for each test case. For the answer may be quite huge, you need only output the answer module 10100.
 
Sample Input
3
4
 
Sample Output
4
9
 
Source
 
Recommend
zhouzeyong

题意:

从(0,0)走到(n,0), 要求:每一步在水平方向上向右走一格,在竖直方向上可以向上走一格、向下走一个、不走。而且路线不能够穿过X轴,问:有多少种符合要求的路线?

题解:

1.可知,走多少步向上,就要多少步向下。假设有k个向上,则先选出在竖直方向上有移动的位置:C[n][2*k]

2.当选出了竖直方向有移动的位置之后,就容易得出这是一个卡特兰数。而h[k] = C[2*k][k] / (k+1)。

3. 而k的取值范围为:0~n/2,所以总共有 sigma(C[n][2*k]*C[2*k][k]/(k+1)) 0<=k<=n/2。然而,题目中n的范围为1e4,用这条计算公式,需要O(n^2)来预处理C[][],故而超时,那怎么办?

3.1 设a[k] = C[k][2*k]*C[2*k][k]/(k+1), 则 a[k-1] = C[n][2*k-2]*C[2*k-2][k-1]/k,通过通过推导,得到:a[k] = a[k-1] * (n-2*k+1) * (n-2*k+1) / (k*(k+1)) 。这样就得出一条线性递推的式子。

3.2 所以总共有 sigma(a[k])种情况, 0<=k<=n/2。

代码如下:

 import java.util.Scanner;
import java.math.BigInteger; public class Main { public static void main(String[] args){ BigInteger[] a = new BigInteger[10010];
Scanner input = new Scanner(System.in);
while(input.hasNext()){
int n = input.nextInt(); a[0] = BigInteger.ONE;
for(int i = 1; i<=n/2; i++) {
a[i] = a[i-1].multiply(BigInteger.valueOf((n-2*i+1)*(n-2*i+2)));
a[i] = a[i].divide(BigInteger.valueOf(i*(i+1)));
} BigInteger ans = BigInteger.ZERO;
for(int i = 0; i<=n/2; i++) {
ans = ans.add(a[i]);
}
System.out.println(ans.mod(BigInteger.TEN.pow(100)));
}
}
}

HDU3723 Delta Wave —— 卡特兰数的更多相关文章

  1. uva 1478 - Delta Wave(递推+大数+卡特兰数+组合数学)

    option=com_onlinejudge&Itemid=8&category=471&page=show_problem&problem=4224" st ...

  2. hdu1032 Train Problem II (卡特兰数)

    题意: 给你一个数n,表示有n辆火车,编号从1到n,入站,问你有多少种出站的可能.    (题于文末) 知识点: ps:百度百科的卡特兰数讲的不错,注意看其参考的博客. 卡特兰数(Catalan):前 ...

  3. 卡特兰数(Catalan)

    卡特兰数又称卡塔兰数,英文名Catalan number,是组合数学中一个常出现在各种计数问题中出现的数列.由以比利时的数学家欧仁·查理·卡塔兰 (1814–1894)命名,其前几项为 : 1, 2, ...

  4. NOIP2003pj栈[卡特兰数]

    题目背景 栈是计算机中经典的数据结构,简单的说,栈就是限制在一端进行插入删除操作的线性表. 栈有两种最重要的操作,即pop(从栈顶弹出一个元素)和push(将一个元素进栈). 栈的重要性不言自明,任何 ...

  5. 卡特兰数 (Catalan)

    卡特兰数:(是一个在计数问题中出现的数列) 一般项公式: 1.         或       2.   递归公式: 1.  或 2. 注:全部可推导. (性质:Cn为奇数时,必然出现在奇数项 2k- ...

  6. HDU 5673 Robot ——(卡特兰数)

    先推荐一个关于卡特兰数的博客:http://blog.csdn.net/hackbuteer1/article/details/7450250. 卡特兰数一个应用就是,卡特兰数的第n项表示,现在进栈和 ...

  7. HDU 1023 Traning Problem (2) 高精度卡特兰数

    Train Problem II Time Limit: 1000MS   Memory Limit: 32768KB   64bit IO Format: %I64d & %I64u Sub ...

  8. HDU1130 卡特兰数

    How Many Trees? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

  9. LightOJ1170 - Counting Perfect BST(卡特兰数)

    题目大概就是求一个n个不同的数能构造出几种形态的二叉排序树. 和另一道经典题目n个结点二叉树不同形态的数量一个递推解法,其实这两个问题的解都是是卡特兰数. dp[n]表示用n个数的方案数 转移就枚举第 ...

随机推荐

  1. 使用jersey组件向图片资源服务器上传图片报403,405,409 Method Not Allowed错误

    一.错误如下 在使用Jersey进行图片跨服务上传时遇到了如下问题: 二.代码如下 1.pom.xml <dependency> <groupId>com.sun.jersey ...

  2. [转] DataSet的的几种遍历

    1. 多表多行多列的情况 foreach (DataTable dt in YourDataset.Tables) //遍历所有的datatable { foreach (DataRow dr in ...

  3. 使用XtraGrid自定义列计算 z

    绑定Master-Detail 关系 数据也是数据显示的一种方式,此实例使用后台代码创建数据源并绑定到gridcontrol. 其实方式参见:点击打开链接 先看效果图(默认方式) 直接给出后台代码,主 ...

  4. JS里面的call, apply以及bind

    参考了这篇文章:http://www.tuicool.com/articles/EVF3Eb 给几个例子 function add(a,b) { alert(a+b); } function sub( ...

  5. can-i-win(好)

    https://leetcode.com/problems/can-i-win/ package com.company; import java.util.*; class Solution { / ...

  6. C#制作、打包、签名、发布Activex全过程【转】

    http://www.cnblogs.com/still-windows7/p/3148623.html 一.前言 最近有这样一个需求,需要在网页上面启动客户端的软件,软件之间的通信.调用,单单依靠H ...

  7. mysql序列号发生器

    mysql序列号发生器 学习了:http://www.jquerycn.cn/a_14577 还可以这样啊:

  8. 阿里巴巴为什么主推HSF?比Dubbo有哪些优势?

    作者:匿名用户链接:https://www.zhihu.com/question/39560697/answer/187538165来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请 ...

  9. awk中的NR FNR

    shell编程中,awk简直就是一把利器,你能够把它看成shell的一部分,也能够看成一种单独的语言,功能十分强大.今天先来说一说NR与FNR 先准备两个文件: 1.txt,内容为: user pas ...

  10. ThinkPHP5.0中Request请求对象的常用操作

    获取当前系统参数 // 获取当前域名 echo '获取当前域名:'.$request->domain() . '<br/>'; // 获取当前入口文件 echo '获取当前入口文件: ...