hdu 5459 Jesus Is Here(厉害的递推)

题意:字符串s[1]="c",s[2]="ff",s[i]=s[i-2]+s[i-1](i>=3);

对于每个n,求s[n]中所有的任意两个字符c的距离之和;

参考:http://blog.csdn.net/u012762625/article/details/48580167

思路:比赛时没思路。用dp[i]表示s[i]的结果,dist[i]表示s[i]中所有c到s[i]末尾的距离之和,len[i]表示s[i]的长度,cnt[i]表示s[i]中c的数量;

dp[i]=dp[i-1]+dp[i-2]+cnt[i-1]*dist[i-2]+cnt[i-2]*((len[i-1]*cnt[i-1])-dist[i-1]);

即两边独立的距离与两边相互关联的距离和;

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define mod 530600414
int t,n,m;
long long dp[500010];
long long cnt[500010],len[500010],dist[500010];
void init(){
    int i,j,k;
    cnt[1]=1,cnt[2]=0;
    len[1]=1,len[2]=2;
    dist[1]=0,dist[2]=0,dist[3]=dist[4]=2;
    dp[1]=dp[2]=dp[3]=dp[4]=0,dp[5]=5;
    for(i=3;i<=300000;i++){
        cnt[i]=(cnt[i-1]%mod+cnt[i-2]%mod)%mod;
        len[i]=(len[i-1]%mod+len[i-2]%mod)%mod;
    }
    for(i=5;i<=300000;i++){
        dist[i]=(dist[i-1]%mod+dist[i-2]%mod+(cnt[i-2]%mod*len[i-1]%mod)%mod)%mod;
    }
    for(i=6;i<=300000;i++){
        dp[i]=(dp[i-1]%mod+dp[i-2]%mod+(cnt[i-1]%mod*dist[i-2]%mod)%mod+(cnt[i-2]%mod*(len[i-1]%mod*cnt[i-1]%mod-dist[i-1]%mod)%mod)%mod)%mod;
    }
}
int main(){
  int i,j,k;
  init();
  scanf("%d",&t);
  for(k=1;k<=t;k++){
    scanf("%d",&n);
    printf("Case #%d: ",k);
    printf("%I64d\n",dp[n]);
  }
  return 0;
}
时间: 2024-10-23 07:46:01

hdu 5459 Jesus Is Here(厉害的递推)的相关文章

Hdu 5459 Jesus Is Here (2015 ACM/ICPC Asia Regional Shenyang Online) 递推

题目链接: Hdu 5459 Jesus Is Here 题目描述: s1 = 'c', s2 = 'ff', s3 = s1 + s2; 问sn里面所有的字符c的距离是多少? 解题思路: 直觉告诉我们,sn肯定由sn-1与sn-2推导出来的.然后呢,我们可以看出 n%2==1 的时候 sn-1 与 sn-2 由 ffff 衔接起来的,n%2==0 的时候,sn-1 与 sn-2由 ff 衔接起来的.告诉队友后,队友就把这个当成重要依据推啊,推啊!!到最后感觉丢队友自己看药丸,放弃02回来和队友

hdu 1207 汉诺塔II (DP+递推)

汉诺塔II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 4529    Accepted Submission(s): 2231 Problem Description 经典的汉诺塔问题经常作为一个递归的经典例题存在.可能有人并不知道汉诺塔问题的典故.汉诺塔来源于印度传说的一个故事,上帝创造世界时作了三根金刚石柱子,在一根柱子上从下往

HDU 4944 FSF’s game(数论+递推)

#include <cstdio> #include <cstring> typedef unsigned long long ll; const ll MOD = (1ULL<<32); const int N = 500001; int t, n; ll ans[N], frc[N]; void init() { for (ll i = 1; i < N; i++) { for (ll j = i; j < N; j += i) { ll tmp = j

HDU 1165 Eddy&#39;s research II(递推)

坑了我好久,乍看很简单,记忆化搜索结果爆栈,然后改成递推之后WA . 后来发现,是在计算m=3的数据时出现了错误,因为当m=3时,即使n很小,结果也会很大,所以无法利用m=2时的结果递推,要怎么办呢?  将m=2的结果打印出来可以发现这是一个等差数列,通项为S(n) = 2*n + 3; 这有什么用呢? 我们可以发现,当 m=3时由递推式可以写成A(m,n) = A(2,A(m,n-1)) = 2*A(m,n-1) + 3; 所以只要知道了A(3,0),我们就能递推出所有m=3时的值了 . 细节

HDU 4914 Linear recursive sequence(矩阵乘法递推的优化)

题解见X姐的论文 矩阵乘法递推的优化,只是mark一下.. HDU 4914 Linear recursive sequence(矩阵乘法递推的优化)

[ACM] hdu 3853 LOOPS (概率DP,递推)

LOOPS Problem Description Akemi Homura is a Mahou Shoujo (Puella Magi/Magical Girl). Homura wants to help her friend Madoka save the world. But because of the plot of the Boss Incubator, she is trapped in a labyrinth called LOOPS. The planform of the

HDU 5459 Jesus Is Here (递推)

有点麻烦的递推,看的时候请耐心,递推的时候不要有嵌套,向小的问题方向分解,然后注意边界. 字符串的递推式为 定义f为Si中的总长度 首先可以得到 然后考虑Si-2和Si-1之间的组合 为了得到小的问题,进行拆分 为了以后表示的方便和逻辑上的清晰,把Si~Si之间的组合总长度定义出来 因为这里的si-2和si-2的中间还有一段Si-3 所以其组合总长度就可以表示为 Ci表示Si中cff出现的次数,Li表示Si的长度 定义一个函数ccl 最后还剩下一个部分Si-2和Si-3 定义 至此,总方案已经可

hdu 5459 Jesus Is Here

一道递推题 感觉这种题找规律对我来说好困难……还是慢慢想吧 题意:s1 = c,s2 = ff,s3 = cff,……s[i] = s[i - 2] + s[i - 1] 从s5开始(s5 = cffffcff),出现了两个cff, 相隔为5,那么输出5 s6 = ffcffcffffcff,输出所有cff之间距离的和,为3+5+8 = 16 s[i],i<=201314,输出ans[i] 思路:由题意发现了一些类斐波那契数列,字符串s[i] = s[i - 2] + s[i - 1],字符串长

2017&quot;百度之星&quot;程序设计大赛 - 复赛1003&amp;&amp;HDU 6146 Pok&#233;mon GO【数学,递推,dp】

Pokémon GO Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 171    Accepted Submission(s): 104 Problem Description 众所周知,度度熊最近沉迷于 Pokémon GO. 今天它决定要抓住所有的精灵球! 为了不让度度熊失望,精灵球已经被事先放置在一个2*N的格子上,每一个格子上都