HDU4828 Grids 2014百度之星初赛题解

看看Catalan数的公式:为 Catalan(n) = C(2n, n) / n+1 = C(2n, n) - C(2n, n-1); (公式0)

然后利用全排序表达:Catalan(n) = (2n)! / (n+1) * (n)!*n!;

那么Catalan(n-1) = (2(n-1))! / n * (n-1)!(n-1)!;

然后两者相除就得到:Catalan(n) = (4*n-2) / (n+1)
(公式1)//这个就是递归的终极公式了。

一般使用动态规划的递推公式是:Catalan(n) = Catalan(0) * Catalan(n-1) + Catalan(1) * Catalan(n-2) + ... + Catalan(n-1) * Catalan(0);(公式2)

公式1自然比公式2快上一个档次了。以前只会用公式2,使用动态规划或者公式0去做,速度自然慢了。

这就这道题目的要诀了。惭愧啊,当时居然没做出来,因为当时数学水平没跟上。经过一个多月的学习数学,参考了一下网上的程序,终于开窍了。

不过安慰下自己,就是当时做出来的人好像才200人多一点,而且资格赛四道题也不过200人多点做出来的,恰好我做完了。

算法高手到底有多少呢?不少,也不多。-- 废话。

呵呵,给大家一个衡量的大概尺度,可以把这道题做出来的人应该可以说是高手了,起码数学这块过关了。

记得一个好像是什么外国语学院的,居然几分钟做出来了,还是外国语学院的,难倒是英语高手+算法高手,厉害。

当然我也是英语高手,呵呵。

扯远了,最后是所谓乘法逆元问题,可以套模板程序了,要知道推导可以参考组合数学书。

就是GCD扩展的算法。扩展之后的系数就是乘法逆元了。

#include <stdio.h>

const int N = 1000001;
const long long MOD = (long long)1E9 + 7LL;
long long g;

void extGCD(long long a,long long b,long long &x,long long &y)
{
	if(b == 0)
	{
		x = 1, y = 0;
		g = a;
		return ;
	}
	extGCD(b, a % b, y, x);
	y -= a / b * x;
}

long long modReverse(long long a, long long n)
{
	long long x, y;
	extGCD(a, n, x, y);
	return (x + n) % n;
}

long long Catalan[N];	//0 1 2 3 4  5  6   7   8    9    10    11    12
void genCatalan()	//1 1 2 5 14 42 132 429 1430 4862 16796 58786 208012
{
	Catalan[0] = Catalan[1] = 1LL;
	for (int i = 2; i < N; i++)
	{
		long long tmp = modReverse(i+1LL, MOD);
		Catalan[i] = Catalan[i - 1] * ((i<<2) - 2) % MOD * tmp % MOD;
	}
}

int main()
{
	genCatalan();
	int T, num;
	scanf("%d", &T);
	for (int t = 1; t <= T; t++)
	{
		scanf("%d", &num);
		printf("Case #%d:\n%I64d\n", t, Catalan[num]);
	}
	return 0;
}

HDU4828 Grids 2014百度之星初赛题解

时间: 2024-10-05 05:06:46

HDU4828 Grids 2014百度之星初赛题解的相关文章

2014 百度之星初赛题解1001 - Energy Conversion

Problem Description 魔法师百小度也有遇到难题的时候-- 现在,百小度正在一个古老的石门面前,石门上有一段古老的魔法文字,读懂这种魔法文字需要耗费大量的能量和大量的脑力. 过了许久,百小度终于读懂魔法文字的含义:石门里面有一个石盘,魔法师需要通过魔法将这个石盘旋转X度,以使上面的刻纹与天相对应,才能打开石门. 但是,旋转石盘需要N点能量值,而为了解读密文,百小度的能量值只剩M点了!破坏石门是不可能的,因为那将需要更多的能量.不过,幸运的是,作为魔法师的百小度可以耗费V点能量,使

2014百度之星资格赛题解

比赛链接:点击打开链接 ,,杭电把比赛关了代码都找不到了.. 无责任民科还是mark一下好了.. HDU 4823 Energy Conversion 把式子变换一下发现是一个等比数列,高速幂就可以. #include<stdio.h> #include<iostream> #include<string.h> #include<math.h> using namespace std; #define ll __int64 #define inf 10000

2014 百度之星 1003 题解 Xor Sum

Xor Sum Problem Description Zeus 和 Prometheus 做了一个游戏,Prometheus 给 Zeus 一个集合,集合中包含了N个正整数,随后 Prometheus 将向 Zeus 发起M次询问,每次询问中包含一个正整数 S ,之后 Zeus 需要在集合当中找出一个正整数 K ,使得 K 与 S 的异或结果最大.Prometheus 为了让 Zeus 看到人类的伟大,随即同意 Zeus 可以向人类求助.你能证明人类的智慧么? Input 输入包含若干组测试数

2014百度之星初赛(第二场)——Best Financing

2014百度之星初赛(第二场)--Best Financing Problem Description 小A想通过合理投资银行理财产品达到收益最大化.已知小A在未来一段时间中的收入情况,描述为两个长度为n的整数数组dates和earnings,表示在第dates[i]天小A收入earnings[i]元(0<=i<n).银行推出的理财产品均为周期和收益确定的,可描述为长度为m的三个整数数组start.finish和interest_rates, 若购买理财产品i(0<=i<m),需要

2014百度之星初赛(第二场)——JZP Set

2014百度之星初赛(第二场)--JZP Set Problem Description 一个{1, ..., n}的子集S被称为JZP集,当且仅当对于任意S中的两个数x,y,若(x+y)/2为整数,那么(x+y)/2也属于S. 例如,n=3,S={1,3}不是JZP集,因为(1+3)/2=2不属于S.但是{1,2,3}的其他子集都属于S,所以n=3时有7个JZP集 给定n,求JZP集的个数. Input 第一行为T,表示输入数据组数. 每组数据包含一行整数n. 限制条件 1<=T<=10^5

2014百度之星初赛(第二场)——Chess

2014百度之星初赛(第二场)--Chess Problem Description 小度和小良最近又迷上了下棋.棋盘一共有N行M列,我们可以把左上角的格子定为(1,1),右下角的格子定为(N,M).在他们的规则中,"王"在棋盘上的走法遵循十字路线.也就是说,如果"王"当前在(x,y)点,小度在下一步可以移动到(x+1, y), (x-1, y), (x, y+1), (x, y-1), (x+2, y), (x-2, y), (x, y+2), (x, y-2)

2014百度之星初赛第一场部分题解

代码太丑就不贴了.,又是一篇无责任民科的题解.. HDU 4828 Grids 看了一下跟卡特兰数差点儿相同就猜了一下,详细为啥我也不知道.. 然后有除法套个逆元.. HDU 4830 pid=4830">Party 发现这个除了叶子节点可能是环,剩下就是一棵树了(假设是单独的环,就用虚拟节点0来连接一下) 剩下就是环状树形dp. . 章鱼图上的树形dp.. . . 类似zoj 3527

2014年百度之星 资格赛题解

比赛地址 1001: Energy Conversion Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 7787 Accepted Submission(s): 1894 Problem Description 魔法师百小度也有遇到难题的时候-- 现在,百小度正在一个古老的石门面前,石门上有一段古老的魔法文字,读懂这种魔法文字需要耗费大量的

2014 百度之星题解 1002 - Disk Schedule

Problem Description 有很多从磁盘读取数据的需求,包括顺序读取.随机读取.为了提高效率,需要人为安排磁盘读取.然而,在现实中,这种做法很复杂.我们考虑一个相对简单的场景. 磁盘有许多轨道,每个轨道有许多扇区,用于存储数据.当我们想在特定扇区来读取数据时,磁头需要跳转到特定的轨道.具体扇区进行读取操作.为了简单,我们假设磁头可以在某个轨道顺时针或逆时针匀速旋转,旋转一周的时间是360个单位时间.磁头也可以随意移动到某个轨道进行读取,每跳转到一个相邻轨道的时间为400个单位时间,跳