HDU 5459 Jesus Is Here (递推,组合数学)
2015-09-22 22:23
302 查看
有点麻烦的递推,递推的原则:向小的问题方向分解,注意边界。
字符串的递推式为
![](https://images2015.cnblogs.com/blog/695852/201509/695852-20150922215732740-324590635.jpg)
定义f为Si中的总方案数
首先可以得到
fi=fi-1+fi-2+组合(si-2,si-1)
然后考虑Si-2和Si-1之间的组合
![](https://images2015.cnblogs.com/blog/695852/201509/695852-20150922220036725-935910299.jpg)
为了得到小的问题,进行拆分
![](https://images2015.cnblogs.com/blog/695852/201509/695852-20150922220140569-1357157862.jpg)
为了以后表示的方便和逻辑上的清晰,把Si~Si之间的组合总长度定义出来
![](https://images2015.cnblogs.com/blog/695852/201509/695852-20150922220331053-1708893375.jpg)
因为这里的si-2和si-2的中间还有一段Si-3
所以其组合总长度就可以表示为
![](https://images2015.cnblogs.com/blog/695852/201509/695852-20150922220455475-146956990.jpg)
Ci表示Si中cff出现的次数,Li表示Si的长度
定义一个函数ccl
![](https://images2015.cnblogs.com/blog/695852/201509/695852-20150922220739537-141869187.jpg)
最后还剩下一个部分Si-2和Si-3
定义
![](https://images2015.cnblogs.com/blog/695852/201509/695852-20150922220934100-1711163180.jpg)
至此,总方案已经可以表示出来
![](https://images2015.cnblogs.com/blog/695852/201509/695852-20150922221034350-581119053.jpg)
然后再从顶往下的逐步细化
考虑g(i)的计算
![](https://images2015.cnblogs.com/blog/695852/201509/695852-20150922221245553-626497415.jpg)
这里面也有个递推,首先可以得到
![](https://images2015.cnblogs.com/blog/695852/201509/695852-20150922221442787-1258992459.jpg)
为了方便再定义一个函数
![](https://images2015.cnblogs.com/blog/695852/201509/695852-20150922221816803-2065256299.jpg)
显然这个容易计算得多
剩下的组合也可以表示出来了
![](https://images2015.cnblogs.com/blog/695852/201509/695852-20150922222005069-277050602.jpg)
最后一部分f12(i)
![](https://images2015.cnblogs.com/blog/695852/201509/695852-20150922222134319-1490584200.jpg)
字符串的递推式为
![](https://images2015.cnblogs.com/blog/695852/201509/695852-20150922215732740-324590635.jpg)
定义f为Si中的总方案数
首先可以得到
fi=fi-1+fi-2+组合(si-2,si-1)
然后考虑Si-2和Si-1之间的组合
![](https://images2015.cnblogs.com/blog/695852/201509/695852-20150922220036725-935910299.jpg)
为了得到小的问题,进行拆分
![](https://images2015.cnblogs.com/blog/695852/201509/695852-20150922220140569-1357157862.jpg)
为了以后表示的方便和逻辑上的清晰,把Si~Si之间的组合总长度定义出来
![](https://images2015.cnblogs.com/blog/695852/201509/695852-20150922220331053-1708893375.jpg)
因为这里的si-2和si-2的中间还有一段Si-3
所以其组合总长度就可以表示为
![](https://images2015.cnblogs.com/blog/695852/201509/695852-20150922220455475-146956990.jpg)
Ci表示Si中cff出现的次数,Li表示Si的长度
定义一个函数ccl
![](https://images2015.cnblogs.com/blog/695852/201509/695852-20150922220739537-141869187.jpg)
最后还剩下一个部分Si-2和Si-3
定义
![](https://images2015.cnblogs.com/blog/695852/201509/695852-20150922220934100-1711163180.jpg)
至此,总方案已经可以表示出来
![](https://images2015.cnblogs.com/blog/695852/201509/695852-20150922221034350-581119053.jpg)
然后再从顶往下的逐步细化
考虑g(i)的计算
![](https://images2015.cnblogs.com/blog/695852/201509/695852-20150922221245553-626497415.jpg)
这里面也有个递推,首先可以得到
![](https://images2015.cnblogs.com/blog/695852/201509/695852-20150922221442787-1258992459.jpg)
为了方便再定义一个函数
![](https://images2015.cnblogs.com/blog/695852/201509/695852-20150922221816803-2065256299.jpg)
显然这个容易计算得多
剩下的组合也可以表示出来了
![](https://images2015.cnblogs.com/blog/695852/201509/695852-20150922222005069-277050602.jpg)
最后一部分f12(i)
![](https://images2015.cnblogs.com/blog/695852/201509/695852-20150922222134319-1490584200.jpg)
#include<bits/stdc++.h> using namespace std; #define PB push_back #define MP make_pair #define fi first #define se second typedef long long ll; const int N = 201314+5; ll f , c , l , g ; const int Mod = 530600414; inline ll f21(int i) { return f[i]-f[i-2]-f[i-1]; } inline ll ccl(int i,int j,int k) { return c[i]*c[j]%Mod*l[k]; } inline ll f12(int i) { return g[i-2]+f21(i-1)+ccl(i-3,i-2,i-2); }//用到i-3 //#define LOCAL int main() { #ifdef LOCAL freopen("in.txt","r",stdin); #endif l[1] = 1; l[2] = 2; l[3] = 3; l[4] = 5; c[3] = 1; c[4] = 1; g[3] = 3; g[4] = 5; for(int i = 5; i <= 201314; i++){ l[i] = (l[i-1]+l[i-2])%Mod; c[i] = (c[i-1]+c[i-2])%Mod; f[i] = (f[i-1]+f[i-2]+g[i-2]+ccl(i-2,i-2,i-3)+f12(i-1)+Mod)%Mod;//用到i-4,所以从5开始 g[i] = (g[i-1]+g[i-2]+ccl(i-1,i-1,i-2)+ccl(i-2,i-2,i-1)+f12(i)+f21(i)+ccl(i-2,i-1,i))%Mod;//用到f[i]和l[i],所以f[i]l[i]在前面 } int T, kas = 0; scanf("%d",&T); while(T--){ int n; scanf("%d",&n); printf("Case #%d: %I64d\n",++kas,f ); } return 0; }
相关文章推荐
- swift中,Optional、?与!之间的关系
- jQuery的学习笔记2
- SharedPreference.Editor的apply和commit方法区别
- xcode
- Fang Fang hdoj 5455 (字符串)
- ZOJ 3811
- Anagrams问题
- oracle 基本技能
- 面对对象思想1
- java将捕获的异常写入日志
- Java多态的应用
- 2015北京网络赛 J Clarke and puzzle 分块+bitset
- ViewPagerIndicator使用时的问题
- Python 经典类和新式类 super用法 (四)
- linux 内核调试相关资料
- Java虚拟机3:常用JVM命令参数
- Javafinal变量
- JavaScript学习总结(五)原型和原型链详解
- 2015年秋季个人阅读计划
- 汉字转拼音类