2015年沈阳网赛 Jesus Is Here(DP中的计数问题)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5459

题目描述:给定一个递推得来的字符串,问字符串中不同cff之间的距离之和,

递推规则:

s1=c; s2=ff

sn=s[n-2]s[n-1];

可以观察到任意一个c都被两个ff包含,所以相当于求任意两个c之间的距离之和。

设s[n-2]为p1,p2,p3,,,,p[x],s[n-1]为q1,q2,q3,,,,q[y];

X和y分别为字符串中c的个数;设cnt_c[i]为第i个字符串中c的个数,

all[i]表示第i个字符串的长度,

那么合并之后字符串为p1,p2,p3,,,,p[cnt_c[i-2]],q1+all[i-2],q2+all[i-2],q3+all[i-2]+,,,,q[cnt_c[i-1]]+all[i-2]

设T[i]表示第i个字符串中任意两个c的距离和,

T[i]=T[i-1]+T[i-2]+F[i];

现在讨论F[i],首先考虑q1与之前的组合,

q1+all[i-2]-p1,q1+all[i-2]-p2,q1+all[i-2]-p3,,,q1+all[i-2]-p[cnt_c[i-2]];

合并之后就为:( q1+all[i-2] )*cnt_c[i-2] - (p1+p2+p3,,,+p[cnt_c[i-2]]);

加上q2,q3,,,q[cnt_c[i-1]]之后,答案就为(q1+q2+q3+,,,q[cnt_c[i-1]])*cnt_c[i-2]

+       all[i-2]*cnt_c[i-2] *cnt_c[i-1] -        (p1+p2+p3,,,+p[cnt_c[i-2]])*cnt_c[i-1];

设s[i]表示第i个字符串中不同c之间的距离之和,

T[i]=T[i-2] + T[i-1] +  s[i-1]*cnt_c[i-2]  +   all[i-2]*cnt_c[i-2] *cnt_c[i-1]  - s[i-2]*cnt_c[i-1];

如果答案是负数,第一可能是(a%MOD+MOD)%MOD,第二可能是long  long写成int了

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cstring>
#include <iostream>
#define mod 530600414
#define MOD 530600414
#define maxn 201315
#define LL long long
using namespace std;
LL s[maxn],cnt_c[maxn],all[maxn],T[maxn];
//cnt_c代表字符串中有多少个c
//all代表字符串中有多少个字符
//s代表字符串中c位置的和
//T[i]=(cnt_c[i-2]*s[i-1] + cnt_c[i-1] * cnt_c[i-2] *all[i-2] -cnt_c[i-1]*s[i-2]);
void solve()
{
  // memset(T,0,sizeof(T));
   cnt_c[1]=1;  cnt_c[2]=0;
   all[1]=1;    all[2]=2;
   s[1]=1;      s[2]=0;
   T[1]=0;      T[2]=0;
   for(int i=3;i<=201314;i++)
   {
       cnt_c[i]=(cnt_c[i-2]+cnt_c[i-1])%MOD;
       all[i]=(all[i-2]+all[i-1])%MOD;
       s[i]=( (s[i-2]+s[i-1])%MOD + (cnt_c[i-1]*all[i-2]) %MOD ) %MOD;

       int a1=( ( ((cnt_c[i-2]*all[i-2])%MOD - (s[i-2] ) ) %MOD *cnt_c[i-1])%MOD )%MOD;
       int b1=(cnt_c[i-2] * s[i-1] ) %MOD;
       T[i]=((T[i-1]+ T[i-2]%MOD +MOD)) %MOD;
       T[i]=( (T[i]+a1+b1)%MOD +MOD)%MOD;
   }
}
int main()
{
  // freopen("test.txt","r",stdin);
   int t,Case=0;
   scanf("%d",&t);
   solve();
   while(t--)
   {
       int input;
       scanf("%d",&input);
       printf("Case #%d: %lld\n",++Case,T[input]);
   }
   return 0;
}
时间: 2024-10-05 22:51:47

2015年沈阳网赛 Jesus Is Here(DP中的计数问题)的相关文章

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个字符串来说,这个

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前缀的

hdu5459 Jesus Is Here(沈阳网赛)

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

hdu 5455 (2015沈阳网赛 简单题) Fang Fang

题目;http://acm.hdu.edu.cn/showproblem.php?pid=5455 题意就是找出所给字符串有多少个满足题目所给条件的子串,重复的也算,坑点是如果有c,f以外的字符也是不满足条件的,还有我被坑了的地方就是当输入很多f的时候,我尽然脑抽的 认为这是不满足条件的,注意这两点就行了,直接暴力 1 #include<cstdio> 2 #include<cstring> 3 using namespace std; 4 int main() 5 { 6 int

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(

hdu5461 Largest Point(沈阳网赛)

Largest Point Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Total Submission(s): 536 Accepted Submission(s): 230 Problem Description Given the sequence A with n integers t1,t2,?,tn. Given the integral coefficients a

【转】HDU 6194 string string string (2017沈阳网赛-后缀数组)

转自:http://blog.csdn.net/aozil_yang/article/details/77929216 题意: 告诉你一个字符串和k , 求这个字符串中有多少不同的子串恰好出现了k 次. 思路: 后缀数组. 我们先考虑至少出现k 次的子串, 所以我们枚举排好序的后缀i (sa[i]) . k段k 段的枚举. 假设当前枚举的是 sa[i]~sa[i + k -1] 那么假设这一段的最长公共前缀  是L 的话. 那么就有L 个不同的子串至少出现了k次. 我们要减去至少出现k + 1次

2015年北京网赛 boxes(bfs)

题目链接: http://hihocoder.com/problemset/problem/1233 题目描述: 给定最多七个箱子,每个箱子的重量都不相同,每次都可以将一个箱子放在相邻的位置上,如果相邻位置上的箱子的重量比它大,那么可以放在相邻位置上的箱子, 小就不可以,问通过这样的操作最少需要多少步可以将这些箱子排好序? 由于最多是7个箱子,而且每个箱子的重量都不相同,那么最多有7!个状态,通过bfs每次需要更新的状态最多有12个状态,可以承受. 接下来就是怎样表示状态了,由于某一个位置可能会

2015长春、沈阳网络赛总结

我所说的总结并不是谈什么题目解法之类的东西 这些东西网上有很多题解 说说这两场网赛吧! 这两场我的状态还行,只是xiaodong还没有找到状态,长春赛lucas+中国剩余定理他硬是打了一整场,还是没打出来,版题没打出来确实不该 wzb状态一般,不过看题的能力依然那么厉害 长春赛中,很遗憾的只出了5道题,按当时过题数目,应该是7道德,可是小东的lucas那题没打出来,而我打得后缀数组那题,当顺时针的时候不用看是否是下标最前面的,但是反过来就需要看了,当时想当然的认为不用,交了4发,一直wa到比赛结