HDU 3723 Delta Wave(2010 Asia Tianjin Regional Contest )
2015-10-03 20:51
423 查看
【题目链接】http://acm.hdu.edu.cn/showproblem.php?pid=3723
【解题报告】
结论题,知道是卡特兰数的话就会很好写。
我们知道最后偏移量为0,所以假如向上偏移一次,就一定会有对应的向下偏移一次。这类似一个入栈出栈操作。
假如有i次入栈,那么对应的i个数的出栈序列为:
其中:
化简公式得到递推式为:
然后高精度递推计算,累加ans[i]即可。
【参考代码】
【解题报告】
结论题,知道是卡特兰数的话就会很好写。
我们知道最后偏移量为0,所以假如向上偏移一次,就一定会有对应的向下偏移一次。这类似一个入栈出栈操作。
假如有i次入栈,那么对应的i个数的出栈序列为:
2*C( 2i,n )*Cat(i).
其中:
cat(i)=cat(i-1)*2(2i-1)/(i+1);
化简公式得到递推式为:
ans[i]/ans[i-1]=(n-2i+2)*(n-2i+1)/(i*(i-1));
然后高精度递推计算,累加ans[i]即可。
【参考代码】
#include<iostream> #include<cstdio> #include<cstring> using namespace std; const int maxn=100000; int C[maxn],ans[maxn]; int n,len; int main() { while( ~scanf("%d",&n) ) { memset(C,0,sizeof(C)); memset(ans,0,sizeof(ans)); C[1]=1; len=1; //i=0的时候 ans[1]=1; //i=0的时候 for( int i=1; i*2<=n; i++ ) { for( int j=1; j<=len; j++ ) C[j]*=(n-2*i+2)*(n-2*i+1); for( int j=1; j<len; j++ ) if(C[j]>9){ C[j+1]+=C[j]/10; C[j]%=10; } while( C[len]>10 )//进位 { C[len+1]=C[len]/10; C[len]%=10; len++; } for( int j=len; j>=1; j-- ) { if( C[j]/(i*(i+1))==0 ) { C[j-1]+=C[j]*10; C[j]=0; if(len==j)len--; } else { C[j-1]+=C[j]%(i*(i+1))*10; C[j]/=i*(i+1); } } for( int j=1; j<=100; j++ )ans[j]+=C[j]; for( int j=1; j<=100; j++ ) { if( ans[j]>9 ) { ans[j+1]+=ans[j]/10; ans[j]%=10; } } } int ans_len=100; while( ans[ans_len]==0 )ans_len--; for( int i=ans_len; i>=1; i-- )printf("%d",ans[i]); printf("\n"); } return 0; }
相关文章推荐
- 学习ThinkPHP3.2.2:video10,可以通过设置 TMPL_FILE_DEPR 简化模板文件目录层次
- codeforces 337D D. Book of Evil(树形dp)
- 学习ThinkPHP3.2.2:video9,function的作用范围
- 《设计前的质量》阅读笔记1
- C++ 内存分配(new,operator new)详解
- 学习ThinkPHP3.2.2:video9,对3.1的分组与3.2.2的模块的理解
- Java与C#的区别
- 项目32.6 输出小星星
- C++primer第五版笔记-第八章IO库
- C语言数据结构相关编程题目(目录)
- spring mvc 异常统一处理
- IOS项目中常见的文件
- 学习ThinkPHP3.2.2:video9,从TP3.2.2开始无需定义APP_NAME常量
- 【bzoj3316】 JC loves Mkk 单调队列+二分答案
- 斐波纳契数列
- Java时间格式化的各种方法
- 望大神批评教育国庆无聊之作:ObjectValidator
- Zend Studio错误总结
- Two Sum
- PHP excel读取excel文件转换为数组