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],字符串长度len[i] = len[i - 1] + len[i - 2], 字符串中c的个数num[i] = num[i - 1] + num[i - 2]。

   然后需要记录字符串中c的位置和,以第一个字符的位置为1,那么sum[i] = sum[i - 1] + sum[i - 2] + len[i - 2] * num[n - 1]。

   关于ans,可以这样考虑, ans[i] = ans[i - 1] + ans[i - 2] + ?

   ?为i - 1和i - 2中cff之间的距离之和,首先算i - 1中所有c到i - 2的字符串串首的距离,既num[i - 1] * len[i - 2] + sum[i - 1]…………一式

   由于i - 2中有num[i - 2]个c,则一式需要乘上num[i - 2],既num[i - 1] * len[i - 2] * num[i - 2] + num[i - 2] * sum[i - 1] …………二式

   实际上i - 1中的c只需要移到i - 2中c的位置,于是二式需要减去sum[n - 2] * num[n - 1]

   化简可得ans[i] = ans[i - 1] + ans[i - 2] + (len[i - 2] * num[i - 2] - sum[i - 2]) * num[i - 1] + sum[i - 1] * num[i - 2]

   然后注意这四个数组都要开long long,不然会溢出,取模要对每一个都取。

代码:

 1 #include <iostream>
 2 #include <cstdio>
 3
 4 using namespace std;
 5
 6 const int N = 201314 + 1;
 7 const int mod = 530600414;
 8 typedef long long ll;
 9
10 ll len[N], num[N], sum[N], ans[N];
11
12 int main()
13 {
14     int t, n;
15
16     cin>>t;
17     len[0] = 1, len[1] = 2, len[2] = 3, len[3] = 5, len[4] = 8, len[5] = 13;
18     num[0] = 1, num[1] = 0, num[2] = 1, num[3] = 1, num[4] = 2, num[5] = 3;
19     sum[0] = 1, sum[1] = 0, sum[2] = 1, sum[3] = 3, sum[4] = 7, sum[5] = 20;
20     ans[4] = 5, ans[5] = 16;
21     for(int i = 5; i < N - 1; i ++ ){
22         len[i+1] = (len[i] + len[i-1]) % mod;
23         num[i+1] = (num[i] + num[i-1]) % mod;
24         sum[i+1] = (sum[i] + sum[i-1] + len[i-1] * num[i]) % mod;
25         ans[i+1] = (ans[i] + ans[i-1] + (((len[i-1] * num[i-1] - sum[i-1]) % mod) * num[i]) % mod + (sum[i] * num[i-1]) % mod) % mod;
26
27     }
28     int flag = 0;
29     while(t -- ){
30         flag ++ ;
31         scanf("%d", &n);
32         printf("Case #%d: ", flag);
33         printf("%d\n", ans[n-1]);
34     }
35     return 0;
36 }

写题解整理了一遍思路(

感觉清楚多了

原文地址:https://www.cnblogs.com/moomight/p/11426463.html

时间: 2024-11-10 14:50:16

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 5459 Jesus Is Here (费波纳茨递推)

Time Limit: 1500/1000 MS (Java/Others)    Memory Limit: 65535/102400 K (Java/Others)Total Submission(s): 250    Accepted Submission(s): 169 Problem Description I've sent Fang Fang around 201314 text messages in almost 5 years. Why can't she make sens

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 定义 至此,总方案已经可

ACM学习历程—HDU 5459 Jesus Is Here(递推)(2015沈阳网赛1010题)

Sample Input 9 5 6 7 8 113 1205 199312 199401 201314 Sample Output Case #1: 5 Case #2: 16 Case #3: 88 Case #4: 352 Case #5: 318505405 Case #6: 391786781 Case #7: 133875314 Case #8: 83347132 Case #9: 16520782 题目要求当前字符串序列中某项里cff前缀两两间差值的和. 假设已经纪录了cff前缀的

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的数量: d

hdu 5459 Jesus Is Here 沈阳网赛

按照这个规律找出来的不断取模之下会得负数.需要(ans+mod)%mod,化为正数. #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define ll __int64 const ll mod=530600414; const int maxn=201399; ll w[maxn],ans[maxn],num[maxn],len[maxn]; void init(

hdu 5459(2015沈阳网赛) Jesus Is Here

题目;http://acm.hdu.edu.cn/showproblem.php?pid=5459 题意 给出一组字符串,每个字符串都是前两个字符串相加而成,求第n个字符串的c的各个坐标的差的和,结果要模530600414. 很容易看出字符串的长度及c的个数都是由斐波那契数列构成的,得到最后结果是ans[i]=ans[i-1]+ans[i-2]+x,要求的就是x 假设第n项中字符'c'的个数为cn,字符'c'坐标之和为sn,字符串长度为ln 当形成第i个字符串的时候对于第i-1个字符串来说,这个

hdu 5459(递推好题)

Jesus Is Here Time Limit: 1500/1000 MS (Java/Others)    Memory Limit: 65535/102400 K (Java/Others)Total Submission(s): 512    Accepted Submission(s): 368 Problem Description I've sent Fang Fang around 201314 text messages in almost 5 years. Why can't

hdu 5459

Problem Description I've sent Fang Fang around 201314 text messages in almost 5 years. Why can't she make sense of what I mean?``But Jesus is here!" the priest intoned. ``Show me your messages."Fine, the first message is s1=''c" and the sec