HDU4828 Grids 百度之星初赛1002解题报告
来源:互联网 发布:电视网络盒子哪个好 编辑:程序博客网 时间:2024/05/23 00:02
搞ACM起步比较晚,但是对这方面兴趣很大,第一次参加百度之星,资格赛水过一道题进入初赛,结果初赛被一道题难倒了。
初赛分两场,每场筛选500人(赛程规定),而之后的结果上看,只有约250人A出题,而大多数人都是通过这道题拿到复赛入场券。这道题我一直觉得非常接近结果了,但是在最重要的环节,也就是取模上出了很大的问题,导致没有A出该题,下面是该题的分析。
题干上,大多数人可以看出看出规律,即求卡特兰数,HDOJ上有相类似的题目,但是这道题的数据量非常大,有100万之多,因而题目上要求对1000000007取模。
卡特兰数有很多递推公式,我选择的是h(n)=h(n-1)*(4*n-2)/(n+1);这条。
由于数据量比较大,因而我选择用打表的方式,但是这里出现了一个问题,卡特兰数的数据在不断的增大,因而一定要在取模的基础上进行递推,然而简单地进行取模会造成递推公式出错,即不能在原结果上直接取模。
比赛时就卡在这点上了,怎么想都想不出改进的方法。
直到后来做到HDOJ的拓展欧几里德的题目(HDOJ 1576),才直到这道题的解法。
除法的取模需要用extgcd的算法进行取逆,这是该题的关键。
该题代码如下:
#include<iostream>using namespace std;__int64 h[1000001];const int MOD=1000000007;int extgcd(int a,int b,int &x,int &y){ if(b==0) { x=1; y=0; return a; } int r=extgcd(b,a%b,x,y); int t=x; x=y; y=t-a/b*y; return r;}int main(){int T;int n,i,j,x,y;h[0]=1;for(i=1;i<=1000000;i++){h[i]=(4*i-2)%MOD;h[i]=(h[i]*h[i-1])%MOD;extgcd(i+1,MOD,x,y);h[i]=(h[i]*(x+MOD)%MOD)%MOD;}cin>>T;for(i=1;i<=T;i++){cin>>n;cout<<"Case #"<<i<<":"<<endl;cout<<h[n]<<endl;}return 0;}
0 0
- HDU4828 Grids 百度之星初赛1002解题报告
- HDU4828 Grids 2014百度之星初赛题解
- 2014百度之星初赛第一轮解题报告:grids
- HDU4828 Grids 2014年百度之星程序设计大赛 - 初赛(第一轮) Catalan数
- 【百度之星2014~初赛解题报告】
- 2014百度之星初赛第一轮解题报告:CycleCocycle
- 2014百度之星初赛第一轮解题报告:information
- 2014百度之星初赛第一轮解题报告:party
- 2014百度之星初赛第二轮解题报告:best_financing
- 2014百度之星初赛第二轮解题报告:chess
- 2015 百度之星初赛1 解题报告
- 2016"百度之星" - 初赛(Astar Round2A)解题报告
- 2016"百度之星" - 初赛(Astar Round2A)解题报告
- 2016"百度之星" - 初赛(Astar Round2B)解题报告
- 2016"百度之星" - 初赛(Astar Round2B)解题报告
- 2016"百度之星" - 初赛(Astar Round2B)解题报告
- 2016"百度之星"-初赛(AstarRound2A)解题报告
- HDU4828(2014百度之星初赛)求乘法逆元&&Catalan数
- UIScrollView自带某些subview,遍历时要注意
- AutoCAD.NET自动加载自己开发的程序集dll
- 数据挖掘之clara算法原理及实例(代码中有bug)
- 删除DataGridView选中行并更新数据库
- 2014半年记
- HDU4828 Grids 百度之星初赛1002解题报告
- oracle 字符串替换 去空格
- 1593. URLs
- uva 11111(线性表)
- 不能修改持久化对象的主键
- POJ 1011 Sticks 【深搜+剪枝】
- [搜索] POJ 3278 Catch that Cow 广搜的讨论
- Document Object Model 文档对象模型
- 多线程