[CSA49G][XSY3315] Bunny on Number Line (DP)

CSA49G
XSY3315
因为判断两串是否本质不同只看某几项是不是好数,与究竟是哪个好数无关,所以考虑转换一下题意:
给出一个长度为aka_kak的01串SSS,第a1,a2,...,aka_1,a_2,...,a_ka1,a2,...,ak项为1,其余项为0。
现要用若干个SSS的前缀拼出串TTT,使得TTT中有nnn个1,以1结尾,并且任意两个1之间0的个数不超过mmm。问所有不同的TTT的长度之和为多少?

SSS如果用01串表示,会很长,发现kkk很小,考虑换一种表示方式:设bi=ai−ai−1b_i=a_i-a_{i-1}bi=aiai1。我们把SSS串描述成{b1,b2,b3,...,bk}\{b_1,b_2,b_3,...,b_k\}{b1,b2,b3,...,bk},表示SSS(b1−1)(b_1-1)(b11)个0,1个1,(b2−1)(b_2-1)(b21)个0,1个1,…,(bk−1)(b_k-1)(bk1)个0,1个1 拼接而成。

g(x,i)g(x,i)g(x,i)表示目前有xxx个1,以 (bi−1)(b_i-1)(bi1)个0+1个1 结尾的01串个数,
f(x,i)f(x,i)f(x,i)表示目前有xxx个1,以 (bi−1)(b_i-1)(bi1)个0+1个1 结尾的01串长度之和。
可以列出dp式:

g(x,i)={g(x−1,i−1)i>1∑j=1kg(x−1,j)×(m−a[1]+1)i=1g(x,i)=\begin{cases}g(x-1,i-1)\qquad i>1\\\sum_{j=1}^{k}g(x-1,j)\times(m-a[1]+1)\qquad i=1\end{cases}g(x,i)={g(x1,i1)i>1j=1kg(x1,j)×(ma[1]+1)i=1

f(x,i)={f(x−1,i−1)+(a[i]−a[i−1])×g(x−1,i−1)i>1∑j=1kf(x−1,j)×(m−a[1]+1)+g(x−1,j)×(a[1]+m)(m−a[1]+1)2i=1f(x,i)=\begin{cases}f(x-1,i-1)+(a[i]-a[i-1])\times g(x-1,i-1)\qquad i>1\\\sum_{j=1}^{k}f(x-1,j)\times(m-a[1]+1)+g(x-1,j)\times\frac{(a[1]+m)(m-a[1]+1)}{2}\qquad i=1\end{cases}f(x,i)={f(x1,i1)+(a[i]a[i1])×g(x1,i1)i>1j=1kf(x1,j)×(ma[1]+1)+g(x1,j)×2(a[1]+m)(ma[1]+1)i=1

把式子用矩阵快速幂优化一下,复杂度是O(k3logn)O(k^3logn)O(k3logn)
(ps.因为fff的转移同时与f,gf,gf,g有关,所以通过矩乘转移的过程有点特殊,具体可以看代码。)

然而还有一个小小的问题:
假设a={2,6,7,9,13}a=\{2,6,7,9,13\}a={2,6,7,9,13}
那么S[1−13]=0100011010001S[1-13]=0100011010001S[113]=0100011010001S[1−6]=010001S[1-6]=010001S[16]=010001S[1−7]=0100011S[1-7]=0100011S[17]=0100011
我们发现S[1−7]+S[1−6]=S[1−13]S[1-7]+S[1-6]=S[1-13]S[17]+S[16]=S[113],即若S[1−y]S[1-y]S[1y]S[1−x]S[1-x]S[1x]的后缀,则S[1−x]S[1-x]S[1x]可以由S[1−y]S[1-y]S[1y],S[1−(x−y)]S[1-(x-y)]S[1(xy)]拼成。但仔细看上面的dp式就会发现S[1−7]+S[1−6]S[1-7]+S[1-6]S[17]+S[16]S[1−13]S[1-13]S[113]被算成了两个串。怎么办?暴力预处理一下,对于前缀S[1−x]S[1-x]S[1x],若有前缀S[1−y]S[1-y]S[1y]同时是S[1−x]S[1-x]S[1x]的后缀,则前缀S[1−x]S[1-x]S[1x]不能取。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=1e9+7;
const int K=110;
int kk,m,n,a[K],pd[K][K],flag[K],ans;
struct Matrix{int n,m,g[K][K],f[K][K];//g:个数 f:长度和 Matrix(int x=0,int y=0){memset(f,0,sizeof(f));memset(g,0,sizeof(g));n=x,m=y;}friend Matrix operator * (Matrix a,Matrix b){Matrix res(a.n,b.m);for(int i=1;i<=a.n;i++){for(int j=1;j<=b.m;j++){__int128 g=0,f=0;for(int k=1;k<=a.m;k++){g+=1ll*a.g[i][k]*b.g[k][j];f+=1ll*a.f[i][k]*b.g[k][j]+1ll*a.g[i][k]*b.f[k][j];}res.g[i][j]=int(g%mod);res.f[i][j]=int(f%mod);}}return res;}
};
int Sum(ll x,ll y){return (x+y)*(y-x+1)/2%mod;
}
int main(){scanf("%d%d%d",&kk,&m,&n);for(int i=1;i<=kk;i++) scanf("%d",&a[i]);sort(a+1,a+kk+1);pd[1][1]=1;for(int i=2;i<=kk;i++){int fl=0;for(int j=2;j<=i;j++){if(pd[i-1][j-1]==1) fl=1;if(pd[i-1][j-1]==1&&(a[j]-a[j-1])==(a[i]-a[i-1])) pd[i][j]=1;}if(a[1]<=a[i]-a[i-1]&&fl) pd[i][1]=1;for(int j=1;j<i;j++)if(pd[i][j]==1) flag[i]=1;}Matrix A(kk,kk),res(1,kk);for(int i=1;i<=kk;i++){if(flag[i]==0){A.g[i][1]=max(m-a[1]+1,0);A.f[i][1]=max(Sum(a[1],m),0);}       }for(int i=1;i<kk;i++){if(a[i+1]-a[i]<=m){A.g[i][i+1]=1;A.f[i][i+1]=a[i+1]-a[i];}}res.g[1][1]=max(m-a[1]+1,0);res.f[1][1]=max(Sum(a[1],m),0);int b=n-1;while(b){if(b&1) res=res*A;b>>=1;A=A*A;}for(int i=1;i<=kk;i++){if(flag[i]==0) ans=(ans+res.f[1][i])%mod;}printf("%d\n",ans);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/320017.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Rabbit的工作(2)

牛客网 文章目录题目描述题解&#xff1a;代码&#xff1a;题目描述 Rabbit通过了上次boss的考核&#xff0c;现在她又遇到了一个问题。 Rabbit接到了K个任务&#xff0c;每个任务她可以自由选择用i天去完成(1≤ i≤ N)。刁钻的boss想让Rabbit恰好用W天完成所有任务。 已知Rabb…

jzoj6065-[NOI2019模拟2019.3.18]One?One!【FFT】

正题 题目链接:https://gmoj.net/senior/#main/show/6065 题目大意 oneness(x)oneness(x)oneness(x)表示xxx的约数中全是111的数的个数&#xff0c;给出一个长度为lll的随机生成的数nnn&#xff0c;求∑i1noneness(i)\sum_{i1}^noneness(i)i1∑n​oneness(i) 解题思路 转换一…

netcore编程之后面对不习惯的xshell黑屏部署,是时候使用jenkins自动化发布工具了...

在很久之前net还只能在windows上部署的时候&#xff0c;或许很多创业公司的朋友发布项目还都是人肉部署&#xff0c;反正windows都是可视化的界面&#xff0c;拖拖拉拉&#xff0c;开开关关还不是特别麻烦。。。现如今你的项目需要在linux上部署&#xff0c;可惜的是再也没有什…

【期望】关灯游戏(金牌导航 期望-8)

关灯游戏 金牌导航 期望-8 题目大意 有n盏灯&#xff0c;有些是亮的&#xff0c;有的是暗的&#xff0c;现在如果按一个位置的开关&#xff0c;那么是它因数的位置的灯都会改变开关情况&#xff0c;现在如果用k步不能直接关完&#xff0c;就随机按&#xff0c;直到可以k步关…

【招聘(重庆)】新空间(重庆)科技有限公司招聘.NET Core

全新平台公司&#xff0c;技术氛围好&#xff0c;未来上升空间巨大!平台架构师薪资范围&#xff1a;15K至40K岗位职责&#xff1a;1、负责公司业务以及相关平台的架构设计、技术选型、研发工作, 参与产品架构的规划与设计&#xff1b;2、遵循总体的架构规划与规范设计项目的应用…

jzoj6067-[NOI2019模拟2019.3.18]More?More!【dp】

正题 题目链接:https://gmoj.net/senior/#main/show/6067 题目大意 nnn个点的一张竞赛图&#xff0c;第iii个点向第jjj个点(i<j)(i<j)(i<j)连边的概率是ppp&#xff0c;否则就是第jjj个点向第iii个点连边。 对于每个i(i<n)i(i<n)i(i<n)求出能够选出一个大小…

[XSY3320] string (AC自动机,哈希,点分治)

XSY3320 前置芝士&#xff1a;回文前缀&&borderborderborder 推荐博客 推荐博客 考虑点分治&#xff0c;问题变成求经过重心的回文路径个数。 一条经过重心的回文路径长这样&#xff1a; xxx到zzz的串与yyy到rootrootroot的串相同。 建出根到每个节点对应的串的AC自…

【期望】守卫挑战(金牌导航 期望-9)

守卫挑战 金牌导航 期望-9 题目大意 有n个数&#xff0c;到第i个数&#xff0c;有p_i的概率选择这个数&#xff0c;问你最后选了最少L个数&#xff0c;且选的数的和再加k大于等于0 样例输入 3 1 0 10 20 30 -1 -1 2样例输出 0.300000数据范围 0⩽k⩽20000\leqslant k\leq…

xinjun与阴阳师

来源&#xff1a;牛客网 文章目录题目描述题解&#xff1a;代码&#xff1a;题目描述 xinjun是各类手游的狂热粉丝&#xff0c;因随手一氪、一氪上千而威震工大&#xff0c;现在他迷上了阴阳师。xinjun玩手游有一个习惯&#xff0c;就是经过层层计算制定出一套方案来使操作利益…

P3311-[SDOI2014]数数【AC自动机,dp】

正题 题目链接:https://www.luogu.com.cn/problem/P3311 题目大意 求一个不超过nnn的数字使其不包含任何sss集合中的数字串。 解题思路 很经典的ACACAC自动机上面dpdpdp&#xff0c;但是因为是数字所以要来点数位dpdpdp的东西&#xff0c;多开一维用0/10/10/1表示是否在上界…

如何在 ASP.Net Core 中使用 Consul 来存储配置

原文: USING CONSUL FOR STORING THE CONFIGURATION IN ASP.NET CORE作者: Nathanael[译者注&#xff1a;因急于分享给大家&#xff0c;所以本文翻译的很仓促&#xff0c;有些不准确的地方还望谅解]来自 Hashicorp 公司的 Consul 是一个用于分布式架构的工具&#xff0c;可以用…

[XSY3381] 踢罐子(几何)

XSY3381 点被选为点对之一的贡献我们单独计算&#xff08;这部分贡献的总和为4n(n−1)(n−2)4n(n-1)(n-2)4n(n−1)(n−2)&#xff09;。接下来只讨论剩余部分的贡献。 先把任意三个点构成的六种选择方案合并&#xff0c;发现在外接圆周和弦之间的点每个有2的贡献&#xff0c;…

GDKOI2021总结

前言 因为疫情的原因&#xff0c;以学校为单位在校参加&#xff01;&#xff08;就很秃然&#xff09; 注&#xff1a;前三天是普及组&#xff0c;后三天是提高组 Day 1 第一次参加&#xff0c;以为会被虐得成狗&#xff0c;以忐忑的心情打开T1 4⩽n⩽20004\leqslant n\leqs…

The Bottom of a Graph Poj 2553

牛客网 poj 2553 文章目录Description题意&#xff1a;题解&#xff1a;代码&#xff1a;Description We will use the following (standard) definitions from graph theory. Let V be a nonempty and finite set, its elements being called vertices (or nodes). Let E be …

P7244-章节划分【RMQ,贪心,递归】

正题 题目链接:https://www.luogu.com.cn/problem/P7244?contestId38911 题目大意 nnn个数字&#xff0c;分成连续非空的kkk段要求每一段的最大值的gcdgcdgcd最大。 解题思路 首先答案一定是最大值的约数&#xff0c;这些数不多我们可以枚举这些数xxx。然后我们称xxx的倍数的…

[XSY3382] 专家系统(二分+线段树)

XSY3382 二分ccc&#xff0c;问题变成能否用一个长ccc宽ccc的矩形框住至少kkk个点。 二维数点问题考虑用扫描线解决。将所有点按照xxx从小到大排序。 枚举一段xxx坐标相差不超过ccc的点&#xff08;双指针推进&#xff09;&#xff0c;初始想法是根据这些点的yyy值建一棵权值…

关于.NET Core是否应该支持WCF Hosting的争论

本文要点本文试图回答“.NET Core 是否应该支持 Windows 通信基础&#xff08;WCF&#xff09; Hosting&#xff1f;”的问题&#xff1b;支持者论据&#xff1a;许多工程师喜欢把 WCF 作为一种编程模型&#xff0c;不希望因为迁移到 .NET Core 而产生&#xff08;机会成本&…

战争尾声(nowcoder 215073)

战争尾声 nowcoder 215073 题目大意 在平面直角坐标系&#xff08;x,y范围均为1~200&#xff09;上&#xff0c;给你n个点&#xff0c;让你找到一个点&#xff0c;使其到所有点直线距离相等&#xff08;答案坐标均为整数&#xff09; 输入样例#1 2 1 2 2 1输出样例#1 1 1…

HDU1269 迷宫城堡(模板题)

HDU1269 迷宫城堡 文章目录Problem Description题解&#xff1a;Problem Description 为了训练小希的方向感&#xff0c;Gardon建立了一座大城堡&#xff0c;里面有N个房间(N<10000)和M条通道(M<100000)&#xff0c;每个通道都是单向的&#xff0c;就是说若称某通道连通…

照看小猫(nowcoder 217602)

照看小猫 nowcoder 217602 题目大意 有n只小猫&#xff0c;对于第i只小猫&#xff0c;给它取一个以小写字母组成的名字&#xff08;长度不大于aia_iai​&#xff09;&#xff0c;问你使所有小猫名字不同的方案数 样例#1 输入样例#1 1 1输出样例#1 26样例解释#1 猫咪的名…