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[]=; cnt_c[]=;
all[]=; all[]=;
s[]=; s[]=;
T[]=; T[]=;
for(int i=;i<=;i++)
{
cnt_c[i]=(cnt_c[i-]+cnt_c[i-])%MOD;
all[i]=(all[i-]+all[i-])%MOD;
s[i]=( (s[i-]+s[i-])%MOD + (cnt_c[i-]*all[i-]) %MOD ) %MOD; int a1=( ( ((cnt_c[i-]*all[i-])%MOD - (s[i-] ) ) %MOD *cnt_c[i-])%MOD )%MOD;
int b1=(cnt_c[i-] * s[i-] ) %MOD;
T[i]=((T[i-]+ T[i-]%MOD +MOD)) %MOD;
T[i]=( (T[i]+a1+b1)%MOD +MOD)%MOD;
}
}
int main()
{
// freopen("test.txt","r",stdin);
int t,Case=;
scanf("%d",&t);
solve();
while(t--)
{
int input;
scanf("%d",&input);
printf("Case #%d: %lld\n",++Case,T[input]);
}
return ;
}
2015年沈阳网赛 Jesus Is Here(DP中的计数问题)的更多相关文章
- hdu 5459(2015沈阳网赛) Jesus Is Here
题目;http://acm.hdu.edu.cn/showproblem.php?pid=5459 题意 给出一组字符串,每个字符串都是前两个字符串相加而成,求第n个字符串的c的各个坐标的差的和,结果 ...
- 2019沈阳网赛树形dp
https://nanti.jisuanke.com/t/41403 2019沈阳网络赛D题 树形dp.一棵树,求任意两个点的距离之和.u-v和v-u算两次.两点之间的距离分为三类,模3等于0,1,2 ...
- 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: 8 ...
- hdu 5455 (2015沈阳网赛 简单题) Fang Fang
题目;http://acm.hdu.edu.cn/showproblem.php?pid=5455 题意就是找出所给字符串有多少个满足题目所给条件的子串,重复的也算,坑点是如果有c,f以外的字符也是不 ...
- hdu 5461(2015沈阳网赛 简单暴力) Largest Point
题目;http://acm.hdu.edu.cn/showproblem.php?pid=5461 题意就是在数组中找出a*t[i]*t[i]+b*t[j]的最大值,特别注意的是这里i和i不能相等,想 ...
- ACM学习历程—HDU 5451 Best Solver(Fibonacci数列 && 快速幂)(2015沈阳网赛1002题)
Problem Description The so-called best problem solver can easily solve this problem, with his/her ch ...
- hdu5461 Largest Point(沈阳网赛)
Largest Point Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total ...
- 2018沈阳网赛F--上下界网络流
建图: 首先加一个源点s和汇点t,分别连接在二分图的左边和右边,每条弧的上下界为[L, R],二分图左边和右边之间连弧上下界为[0,1],其实就相当于连弧为1. 然后问题就转换为:有源汇最大流. 继续 ...
- 2015年北京网赛 boxes(bfs)
题目链接: http://hihocoder.com/problemset/problem/1233 题目描述: 给定最多七个箱子,每个箱子的重量都不相同,每次都可以将一个箱子放在相邻的位置上,如果相 ...
随机推荐
- 【dp】codeforces C. Vladik and Memorable Trip
http://codeforces.com/contest/811/problem/C [题意] 给定一个自然数序列,在这个序列中找出几个不相交段,使得每个段的异或值之和相加最大. 段的异或值这样定义 ...
- hdu 分类
HDU分类 http://www.cnblogs.com/ACMan/archive/2012/05/26/2519550.html#2667329 努力A完.方便自己系统A题 不断更新中...... ...
- selenide01---截图
1.junit:import com.codeborne.selenide.junit.ScreenShooter; @Rule public ScreenShooter makeScreenshot ...
- centos下wget时提示unable to resolve host address ...
网络正常的情况,可以查看/etc/resolv.conf [root@localhost ~]# more /etc/resolv.conf # Generated by NetworkManager ...
- gcc,gdb基础学习2
gdb调试: 源文件:test.cc >>g++ -g test.cc -o test.o 这里需要参数-g,因为接下来要使用gdb进行调试,生成目标文件test·o 因为需要将调试信息 ...
- php桥接模式
php桥接模式 桥接模式是将抽象部分与它的实现部分分离,使它们都可以独立地变化. 示例:当一个信息时根据发送渠道分为:QQ消息.email消息.短信消息等根据消息类型分为:普通.警告.危急等每种消息都 ...
- .NET Core windows开发环境 + Git代码控管 + Docker 部署环境搭建
开发环境准备 下载vs code,.NET Core sdk: https://www.microsoft.com/net/core#windowscmd 目前最新版为code 1.8.1,.NET ...
- 如何把你的Windows PC变成瘦客户机
越来越多的用户开始使用vmware view 4.5来做为企业桌面虚拟化的平台,通过view,所有的管理工作都转移到数据中心,但是考虑到成本原因,很多人员还在使用PC机,有没有办法将PC机变成瘦客户机 ...
- QT窗体间传值总结之Signal&Slot
在写程序时,难免会碰到多窗体之间进行传值的问题.依照自己的理解,我把多窗体传值的可以使用的方法归纳如下: 1.使用QT中的Signal&Slot机制进行传值: 2.使用全局变量: 3.使用pu ...
- hdu 4599 Dice
数学能力已经彻底降低到了小学水平,真是惨啊惨... 首先G(M)很容易确定,G(M) = 6 * M; H(N) = 6 * F(N),于是推出来H(N)就可以了,昨天请教了一下别人,直接数学公式搞定 ...