AtCoder 4169 [ARC100D] Colorful Sequences(dp)

problem

洛谷链接

solution

逆向考虑。ans=ans=ans= 所有蛋糕中的 aaa 序列出现次数 −-non−colorfulnon-colorfulnoncolorful 蛋糕中的出现次数。

在所有蛋糕中的出现次数,即 (n−m+1)⋅kn−m(n-m+1)·k^{n-m}(nm+1)knm,枚举 aaa 序列开头的位置,除去 aaa 序列占据的位置以外的位置的颜色是随便的 1∼k1\sim k1k

因为 aaa 的出现是可以有重复位置的,所以每个位置的序列的贡献都是独立计算的,没有什么需要去重的问题。

然后考虑在 non−colorfulnon-colorfulnoncolorful 蛋糕中的出现次数。

  • 首先得特判,aaa 本身就已经是一个 colorfulcolorfulcolorful 蛋糕。那么只要包含 aaa 就一定是满足条件的蛋糕。

    直接输出在所有蛋糕中的出现次数结束程序。

  • aaa 蛋糕颜色序列中各个颜色互不相同。

    考虑用 dpdpdp 来做。

    f(i,j):f(i,j):f(i,j):iii 为止,后面一段连续颜色各不相同的长度为 jjj,即 [i−j+1,i][i-j+1,i][ij+1,i] 颜色互不相同,的 non−colorfulnon-colorfulnoncolorful 蛋糕个数。

    设计 i−1→ii-1\rightarrow ii1i 的转移方程。

    • 随便新选一个未曾出现的颜色。

      f(i−1,j−1)⋅(k−j+1)→f(i,j):f(i-1,j-1)·(k-j+1)\rightarrow f(i,j):f(i1,j1)(kj+1)f(i,j):

    • i−1i-1i1 的长度更长,在 iii 时选择了和恰当位置相同颜色,将 i−1i-1i1 恰好卡成了 jjj 的长度。

      f(i−1,j′)→f(i,j)j′≥jf(i-1,j')\rightarrow f(i,j)\quad j'\ge jf(i1,j)f(i,j)jj

    gi,j:g_{i,j}:gi,j: 记录 fi,jf_{i,j}fi,j 类的所有可能蛋糕中出现 a1,...,ma_{1,...,m}a1,...,m 的个数。

    事实上,我们转移时并不知道具体的蛋糕长相,所以不能判断是否连续长度为 mmm 的未重复的就一定是 aaa

    所以在转移时只要 j≥mj\ge mjm,即出现连续长度达到 mmm 的互不相同颜色的连续蛋糕层,就记录贡献。

    f(i,j)→g(i,j)f(i,j)\rightarrow g(i,j)f(i,j)g(i,j)

    因为连续长度有 mmm 的连续蛋糕层的每种情况都是均匀分布,最后限制其顺序和颜色值,即 /A(k,m)/A(k,m)/A(k,m) 即可。

  • aaa 蛋糕颜色序列中有重复颜色。

    也就是说,判断一个蛋糕是否是 colorfulcolorfulcolorful 的区间一定不会横跨 / 完全包含 aaa

    那么 aaa 就将整个蛋糕划分成了前一部分,aaa ,后一部分,三部分彼此独立。

    枚举 aaa 的开始位置,可以使用卷积 / 乘法定理求左右蛋糕组合情况,分开求解,进而是一整个蛋糕的颜色序列可能数。

    显然,求解计算的 non−colorfulnon-colorfulnoncolorful 个数与上面 fff 是一样的转移。

    只是在初始化上有所不同。

    aaa 求前缀和后缀最长不重复颜色长度,分别记为 l,rl,rl,r

    f(i,j)f(i,j)f(i,j) 来计算前一部分,g(i,j)g(i,j)g(i,j) 来计算后一部分,这里的 f,gf,gf,g 与上一种情况的 f,gf,gf,g 并不一样。

    f0,0=f0,1=...=f0,l=g0,0=g0,1=...=g0,r=1f_{0,0}=f_{0,1}=...=f_{0,l}=g_{0,0}=g_{0,1}=...=g_{0,r}=1f0,0=f0,1=...=f0,l=g0,0=g0,1=...=g0,r=1

  • 注意:这里算的是 non−colorfulnon-colorfulnoncolorful 蛋糕中的贡献,所以在 dpdpdp 中不能让连续未重复颜色长度达到 kkk

code

#include <bits/stdc++.h>
using namespace std;
#define mod 1000000007
#define int long long
#define maxn 25005
#define maxk 405
int n, k, m;
int a[maxn];
int f[maxn][maxk], g[maxn][maxk];
bool vis[maxk];int qkpow( int x, int y ) {int ans = 1;while( y ) {if( y & 1 ) ans = ans * x % mod;x = x * x % mod;y >>= 1;}return ans;
}bool check( int l, int r ) {memset( vis, 0, sizeof( vis ) );for( int i = l;i <= r;i ++ )if( vis[a[i]] ) return 0;else vis[a[i]] = 1;return 1;
}bool colorful() { //判断a是否本身就是彩虹的for( int i = 1;i + k - 1 <= m;i ++ )if( check( i, i + k - 1 ) ) return 1;return 0;
}signed main() {scanf( "%lld %lld %lld", &n, &k, &m );for( int i = 1;i <= m;i ++ ) scanf( "%lld", &a[i] );int ans = ( n - m + 1 ) * qkpow( k, n - m ) % mod;if( colorful() ) return ! printf( "%lld\n", ans );int l = -1, r = -1;memset( vis, 0, sizeof( vis ) );for( int i = 1;i <= m;i ++ )if( vis[a[i]] ) { l = i - 1; break; }else vis[a[i]] = 1;memset( vis, 0, sizeof( vis ) );for( int i = m;i >= 1;i -- )if( vis[a[i]] ) { r = m - i; break; }else vis[a[i]] = 1;int tot;if( ! ~l ) {f[0][0] = 1;for( int i = 1;i <= n;i ++ ) {for( int j = 1;j < k;j ++ ) {/*因为不能是colorful所以不能让未重复长度达到k1.f[i-1][j-1]->f[i][j] 随便加一个未出现的数字 有(k-j+1)种因为f'[i-1]是后缀和过的 f'[i-1][j-1]-f'[i-1][j]=f[i-1][j-1]2.f[i-1][j<=j']->f[i][j] 选择合适位置对应的数字 将未重复长度减小因为f'[i-1]是后缀和过的 f[i-1][j<=j']=f[i][j]*/f[i][j] = ((f[i - 1][j - 1] - f[i - 1][j] + mod) % mod * (k - j + 1) % mod + f[i - 1][j]) % mod;g[i][j] = ((g[i - 1][j - 1] - g[i - 1][j] + mod) % mod * (k - j + 1) % mod + g[i - 1][j]) % mod;if( j >= m ) ( g[i][j] += f[i][j] ) %= mod; //当长度达到m的时候就可以计算个数了}for( int j = k - 1;j;j -- ) { //后缀和( f[i][j - 1] += f[i][j] ) %= mod;( g[i][j - 1] += g[i][j] ) %= mod;}}tot = g[n][0]; //此时的g只是算的长度为m的未重复的个数 包含了给出的a 还有一些其余的数列//这里的a强调顺序以及数值 所以要除以A(k,m)for( int i = k;i > k - m;i -- ) tot = tot * qkpow( i, mod - 2 ) % mod;}else {//前后卷积for( int i = 0;i <= l;i ++ ) f[0][i] = 1;for( int i = 0;i <= r;i ++ ) g[0][i] = 1;for( int i = 1;i <= n;i ++ ) {for( int j = 1;j < k;j ++ ) {f[i][j] = ((f[i - 1][j - 1] - f[i - 1][j] + mod) % mod * (k - j + 1) % mod + f[i - 1][j]) % mod;g[i][j] = ((g[i - 1][j - 1] - g[i - 1][j] + mod) % mod * (k - j + 1) % mod + g[i - 1][j]) % mod;}for( int j = k - 1;j;j -- ) {( f[i][j - 1] += f[i][j] ) %= mod;( g[i][j - 1] += g[i][j] ) %= mod;}}tot = 0;for( int i = 0;i <= n - m;i ++ )tot = ( tot + f[i][0] * g[n - m - i][0] % mod ) % mod;}printf( "%lld\n", ( ans - tot + mod ) % mod );return 0;
}

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

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

相关文章

VS2017 无法连接到Web服务器“IIS Express”终极解决方案

今天日了gou了&#xff0c;一大早打开VS2017的时候出现无法连接到Web服务器“IIS Express”的错误&#xff0c;然后必应了一下&#xff0c;再谷歌了一下找到的解决方法也都千篇一律&#xff0c;奈何都没能解决&#xff0c;最后通过静下心来的思考&#xff0c;尝试解决了问题&am…

CodeForces 1361E James and the Chase(dfs + 结论)

problem 洛谷链接 solution 看到这个 20%20\%20% 的特殊性质&#xff0c;脑海里第一个就想到了随机化算法。已经PTSD了着实上头 如果本题只是随便求一个 interesting\text{interesting}interesting 的点&#xff0c;那就非常简单了。 随机化一个点&#xff0c;检查这个点是…

2021牛客暑期多校训练营4

2021牛客暑期多校训练营4 题号题目知识点ACourseBSample GameCLCSDRebuild TreeETree Xor思维线段树FJust a jokeGProductHConvolutionIInverse PairJAverage

Docker最全教程之使用.NET Core推送钉钉消息(二十)

前言上一篇我们通过实战分享了使用Go推送钉钉消息&#xff0c;由于技痒&#xff0c;笔者现在也编写了一个.NET Core的Demo&#xff0c;作为简单的对照和说明。最后&#xff0c;由于精力有限&#xff0c;笔者希望有兴趣的朋友可以分享下使用CoreRT将.NET Core编译成机器代码这块…

[线性代数学习笔记] 线性递推数列及 Berlekamp-Massey 算法的详细推导过程

线性递推数列 线性递推 对于无限数列 {a0,a1,...}\{a_0,a_1,...\}{a0​,a1​,...} 和有限非空数列 {r0,r1,...,rm−1}\{r_{0},r_1,...,r_{m-1}\}{r0​,r1​,...,rm−1​} 。 若对于任意 m−1≤nm-1\le nm−1≤n &#xff0c;有 ∑i0m−1an−iri0\sum_{i0}^{m-1}a_{n-i}r_i0∑…

Average

Average 题意&#xff1a; 矩阵W的值可以通过数组a和b得到&#xff0c;W[i][j]a[i]b[j],现在求W的一个子矩阵&#xff0c;平均值最大&#xff0c;且子矩阵必须满足宽度至少是x&#xff0c;高度至少是y&#xff0c;计算最大平均值 题解&#xff1a; 那答案就变成了分别对a和b…

开箱即用Bumblebee独立部署搭建webapi网关详解

在之前的章节里都是讲述如何在程序中使用Bumblebee来构建一个Webapi网关&#xff1b;但这样显然有些麻烦&#xff0c;毕竟很多时候可能只需要一个简单负载处理&#xff0c;还需要写个程序针对服务进行编写代码或配置的确是比较麻烦的事情&#xff1b;如果有负载方面的调整还需要…

LCS(2021牛客多校4)

LCS(2021牛客多校4) 题意&#xff1a; 让你构造三个字符串s1,s2,s3&#xff0c;长度均为n,要求LCS(s1,s2)a,LCS(s2,s3)b,LCS(s1,s3)c 题解&#xff1a; 先考虑三个串互相LCS为x,y,z,且x>y>z 显然如果xy-n>z则无解&#xff0c;反之xy-n<z有解 那么就先给三个串加…

CodeForces 1616H Keep XOR Low {a^b≤x} / CodeForces gym102331 Bitwise Xor {a^b≥x}(trie树 + 计数)

文章目录CodeForces 1616H Keep XOR LowproblemsolutioncodeCodeForces gym102331 Bitwise XorproblemsolutioncodeCodeForces 1616H Keep XOR Low problem 洛谷链接 solution 虽然选的是一个子集&#xff0c;但本质还是二元限制。 这非常类似以前做过的题目&#xff0c;已…

ASP.NET Core 文件系统

静态文件 目录浏览 默认页面 MIME类型配置 实战文件服务器 紧接上一讲 中间件 之后&#xff0c;今天来我们来讲一下关于 ASP.NET Core 中静态文件服务。什么是静态文件&#xff1f;先看一下下面例子&#xff08;在客户端浏览器中通过 url 路径访问了网站的一张图片&#xff09…

[C++] iota语句的语法

头文件为 numeric #include <numeric> using namespace std;语法和 sort / lower_bound / upper_bound 等差不多&#xff0c;都是前闭后开的原则。 iota(Ax,Ay,z) &#xff1a;表示将 AAA 数组的 [x,y)[x,y)[x,y) 区间进行填充&#xff0c;从 zzz 开始&#xff0c;每填…

如何使用vs将asp.net core项目添加容器支持并发布docker镜像到私有dockerhub和添加k8s/helm管理...

这篇文章介绍一下&#xff0c;如何使用VS2017给asp.net core添加容器支持&#xff0c;并发布镜像到私有docker hub&#xff0c;然后用chart管理容器镜像的操作流程。话不多说&#xff0c;just do it.新建项目首先新建一个asp.net core项目&#xff0c;这里我新建一个WebApi默认…

Inverse Pair

Inverse Pair 题意&#xff1a; 一个数组a&#xff0c;现在构造一个数组c&#xff0c;c[i]a[i]0/1&#xff08;0或1&#xff09;&#xff0c;使得c的逆序对最少 题解&#xff1a; 如果x在x1的后面&#xff0c;我们让x这个数1,x1不变&#xff0c;就可以让逆序对少1。如果x在…

CodeForces 1610H Squid Game(延迟贪心 + 构造 + 树状数组)

problem 洛谷链接 solution 考虑重新随便钦定一个点为“根”&#xff0c;并且强制根必须是关键点。 则所有 x−yx-yx−y 不是直系祖先-子代的要求&#xff08;要求Ⅰ&#xff09;&#xff0c;即 xxx 不是 yyy 祖先&#xff0c;yyy 也不是 xxx 祖先&#xff0c;一定都被满足…

P4551 最长异或路径

P4551 最长异或路径 题意&#xff1a; 给定一棵 n 个点的带权树&#xff0c;结点下标从 1 开始到 n。寻找树中找两个结点&#xff0c;求最长的异或路径。 异或路径指的是指两个结点之间唯一路径上的所有边权的异或。 题解&#xff1a; 我们指定1为根节点&#xff0c;T(u,v…

[小技巧]EF Core中如何获取上下文中操作过的实体

原文地址&#xff1a;https://www.cnblogs.com/lwqlun/p/10576443.html作者&#xff1a;Lamond Lu 源代码&#xff1a;https://github.com/lamondlu/EFCoreFindSample背景介绍当我们在工作单元(UnitOfWork)中使用EF/EF Core的时候&#xff0c;为了要保持事务&#xff0c;一个用…

CF1621G Weighted Increasing Subsequences(离散化+树状数组优化dp+栈维护后缀最大值+计数)

problem luogu-link solution 显然单独考虑每个 iii 的贡献&#xff0c;即被多少个合法上升子序列包含。 令 xmax⁡{j∣j>i∧aj>ai}x\max\{j\ |\ j>i\wedge a_j>a_i\}xmax{j ∣ j>i∧aj​>ai​}&#xff0c;则包含 iii 的合法子序列的结尾元素最远只能到…

Acwing 232. 守卫者的挑战

Acwing 232. 守卫者的挑战 题意&#xff1a; 有n个挑战&#xff0c;一开始背包容量为k&#xff0c;每次挑战有p[i]的概率成功&#xff0c;成功的话会得到一个大小为1的地图碎片或者是提升背包容量X&#xff0c;所有的地图碎片必须装在包里&#xff0c;问最后带地图离开的概率…

IdentityServer4-前后端分离之Vue

前言之前文章讲到如何使用Node.jsExpress构建JavaScript客户端&#xff0c;实现前后端分离。本节将介绍如何使用Vue实现前后端分离&#xff0c;文中介绍Vue的知识比较基础&#xff0c;适合新手学习。一、搭建Vue项目前提条件&#xff1a;安装nodejs、webpack和vue-cli。这个网上…

P1850 [NOIP2016 提高组] 换教室

P1850 [NOIP2016 提高组] 换教室 题意&#xff1a; 有2n个课安排在n个时间段上&#xff0c;每个时间段上都有两个一样的课同时在不同地方上&#xff0c;起初牛牛被所有课都被安排在Ci上课&#xff0c;另一节课在Di上课。牛牛现在想跟换到Di位置&#xff0c;它最多可以申请m节…