码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 5459 Jesus Is Here (递推)

时间:2015-09-22 23:24:40      阅读:158      评论:0      收藏:0      [点我收藏+]

标签:

有点麻烦的递推,看的时候请耐心,递推的时候不要有嵌套,向小的问题方向分解,然后注意边界。

字符串的递推式为

技术分享

定义f为Si中的总长度

首先可以得到

技术分享

然后考虑Si-2和Si-1之间的组合

技术分享

为了得到小的问题,进行拆分

技术分享

为了以后表示的方便和逻辑上的清晰,把Si~Si之间的组合总长度定义出来

技术分享

因为这里的si-2和si-2的中间还有一段Si-3

所以其组合总长度就可以表示为

技术分享

Ci表示Si中cff出现的次数,Li表示Si的长度

定义一个函数ccl

技术分享

最后还剩下一个部分Si-2和Si-3

定义

技术分享

至此,总方案已经可以表示出来

技术分享

然后再从顶往下的逐步细化

 

考虑g(i)的计算

技术分享

这里面也有个递推,首先可以得到

技术分享

为了方便再定义一个函数

技术分享

显然这个容易计算得多

剩下的组合也可以表示出来了

技术分享

最后一部分f12(i)

技术分享

 

#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[N], c[N], l[N], g[N];
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[n]);
    }
    return 0;
}

 

HDU 5459 Jesus Is Here (递推)

标签:

原文地址:http://www.cnblogs.com/jerryRey/p/4830700.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!