[atARC100F]Colorful Sequences
考虑求任意序列中$a$出现次数之和减去不合法序列中$a$出现次数之和,前者即为$(n-m+1)k^{n-m}$(一个序列重复次数恰好为$a$出现次数),对于后者,先忽略$a$的次数,即统计有多少个不合法序列
考虑dp,令$f[i][j]$表示前$i$个数,后$j$个数各不相同(且后$j+1$个数存在相同)的不合法序列数,转移对最后一个数分类讨论:
1.与第$i-j$个数不同,即长度增加1,则有$f[i][j]+=(k-(j-1))f[i-1][j-1]$
2.与第$i-j$个数相同,那么上一次长度任意,即$f[i][j]+=\sum_{t=j}^{k}f[i-1][t]$
暴力时间复杂度为$o(nk^{2})$,前缀和优化可以做到$o(nk)$,再考虑$a$的影响,对$a$分类讨论:
1.若$a$中包含一个$k$阶排列($a$合法),那么存在$a$必然合法,即不合法序列中$a$出现次数之和为0
2.若$a$中元素各不相同且$m<k$,定义$g[i][j]$表示所有$f[i][j]$序列中长为$m$且各不相同的子串数之和,转移类似,即在$j\ge m$时累计入$g[i][j]$中即可
同时,由于$m$个元素以及顺序已经确定,因此要除以$P(k,m)$(其中$P$为排列,即$P(n,m)=\frac{n!}{(n-m)!}$)
3.若$a$中包含相同的元素,令$x$为最大的$x$满足$[1,x]$中元素各不相同,$y$为最小的$y$使得$[y,m]$中元素各不相同,将整个序列分为$[1,x]$、$(x,y)$和$[y,m]$三部分
若$(x,y)$非空,那么即要求$(x,y)$不会影响其合法性,考虑如果存在一段长度为$k$的排列经过这个,那么必然不能完全在$[1,m]$内部(第一种情况),那么如果选择左边"出去",则不能选择到$x+1$,右边同理,即得证
具体来说,先枚举出现$a$的位置$i$,再枚举最后一段,即$\sum_{i=1}^{n}\frac{\sum_{j=x}^{k-1}f[i+x-1][j]}{P(k,x)}\cdot \frac{\sum_{j=m-y+1}^{k-1}f[n-(i-1)-(y-1)][j]}{P(k,m-y+1)}$
1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 25005
4 #define K 405
5 #define mod 1000000007
6 int n,m,k,ans,inv[K],a[N],vis[N],las[K],f[N][K],g[N][K];
7 int p_inv(int n,int m){
8 int ans=1;
9 for(int i=n-m+1;i<=n;i++)ans=1LL*ans*inv[i]%mod;
10 return ans;
11 }
12 int main(){
13 inv[0]=inv[1]=1;
14 for(int i=2;i<K-4;i++)inv[i]=1LL*(mod-mod/i)*inv[mod%i]%mod;
15 scanf("%d%d%d",&n,&k,&m);
16 for(int i=1;i<=m;i++)scanf("%d",&a[i]);
17 ans=n-m+1;
18 for(int i=1;i<=n-m;i++)ans=1LL*ans*k%mod;
19 int tot=0,flag=0,x,y;
20 for(int i=1;i<=m;i++){
21 if (++vis[a[i]]==1)tot++;
22 if ((i>k)&&(--vis[a[i-k]]==0))tot--;
23 if (tot==k){
24 printf("%d",ans);
25 return 0;
26 }
27 }
28 f[0][0]=1;
29 for(int i=1;i<=n;i++){
30 tot=0;
31 for(int j=k-1;j;j--){
32 tot=(tot+f[i-1][j])%mod;
33 f[i][j]=(1LL*(k-j+1)*f[i-1][j-1]+tot)%mod;
34 }
35 }
36 for(int i=1;i<=m;i++)las[a[i]]=i;
37 for(int i=1;i<=m;i++)
38 if (las[a[i]]!=i)flag=1;
39 if (!flag){
40 for(int i=1;i<=n;i++){
41 tot=0;
42 for(int j=k-1;j;j--){
43 tot=(tot+g[i-1][j])%mod;
44 g[i][j]=(1LL*(k-j+1)*g[i-1][j-1]+tot)%mod;
45 if (j>=m)g[i][j]=(g[i][j]+f[i][j])%mod;
46 }
47 }
48 tot=0;
49 for(int i=1;i<=k;i++)tot=(tot+g[n][i])%mod;
50 printf("%d",(ans+mod-1LL*tot*p_inv(k,m)%mod)%mod);
51 return 0;
52 }
53 memset(las,0,sizeof(las));
54 for(int i=1;i<=m;i++){
55 if (las[a[i]]){
56 x=i-1;
57 break;
58 }
59 las[a[i]]=1;
60 }
61 memset(las,0,sizeof(las));
62 for(int i=m;i;i--){
63 if (las[a[i]]){
64 y=i+1;
65 break;
66 }
67 las[a[i]]=1;
68 }
69 for(int i=1;(i+x-1<=n)&&(i-1<=n-(y-1));i++){
70 int s1=0,s2=0;
71 for(int j=x;j<k;j++)s1=(s1+f[i+x-1][j])%mod;
72 for(int j=m-y+1;j<k;j++)s2=(s2+f[n-(i-1)-(y-1)][j])%mod;
73 s1=1LL*s1*p_inv(k,x)%mod;
74 s2=1LL*s2*p_inv(k,m-y+1)%mod;
75 ans=(ans+mod-1LL*s1*s2%mod)%mod;
76 }
77 printf("%d",ans);
78 }
[atARC100F]Colorful Sequences的更多相关文章
- Atcoder 乱做
最近感觉自己思维僵化,啥都不会做了-- ARC103 F Distance Sums 题意 给定第 \(i\) 个点到所有点的距离和 \(D_i\) ,要求构造一棵合法的树.满足第 \(i\) 个点到 ...
- 【AtCoder】ARC100 题解
C - Linear Approximation 找出\(A_i - i\)的中位数作为\(b\)即可 题解 #include <iostream> #include <cstrin ...
- ARC 100
链接 https://arc100.contest.atcoder.jp/ C Linear Approximation 题解 把ai减去i后排序, 我们要的b就是排完序后的中位数 Code #inc ...
- AtCoder Regular Contest 100
传送门 C - Linear Approximation 题意: 求 \[ \sum_{i=1}^nabs(A_i-(b+i)) \] \(A_i,b\)给出. 思路: 将括号拆开,变为\(A_i-i ...
- AtCoder练习
1. 3721 Smuggling Marbles 大意: 给定$n+1$节点树, $0$为根节点, 初始在一些节点放一个石子, 然后按顺序进行如下操作. 若$0$节点有石子, 则移入盒子 所有石子移 ...
- [LeetCode] Repeated DNA Sequences 求重复的DNA序列
All DNA is composed of a series of nucleotides abbreviated as A, C, G, and T, for example: "ACG ...
- [Leetcode] Repeated DNA Sequences
All DNA is composed of a series of nucleotides abbreviated as A, C, G, and T, for example: "ACG ...
- 论文阅读(Weilin Huang——【AAAI2016】Reading Scene Text in Deep Convolutional Sequences)
Weilin Huang--[AAAI2016]Reading Scene Text in Deep Convolutional Sequences 目录 作者和相关链接 方法概括 创新点和贡献 方法 ...
- leetcode 187. Repeated DNA Sequences 求重复的DNA串 ---------- java
All DNA is composed of a series of nucleotides abbreviated as A, C, G, and T, for example: "ACG ...
随机推荐
- Solon 框架如何方便获取每个请求的响应时间?
经常会有同学问 Solon 怎样才能获取每个请求的响应时间?要求是不需要给每个函数加注解.故此,整理了一下. 不给每个函数加注解,主要有两种方式可以获取请求响应时间: 方式1:基于全局过滤器 Solo ...
- UE4蓝图AI角色制作(六)之行为树
13.行为树原理 AI最重要的环节就是行为树.我们将解释什么是行为树.为何它如此重要,以及构建行为树需要哪些元素. 借助行为树,我们可以轻松控制并显示AI的决策制定过程.行为树是一种将AI在场景中的决 ...
- 耗时一个月,整理出这份Hadoop吐血宝典
本文目录: 一.HDFS 二.MapReduce 三.Yarn 四.Hadoop3.x 新特性 五.Hadoop 大厂面试真题解析 Hadoop 涉及的知识点如下图所示,本文将逐一讲解: 本文档参考了 ...
- Vue3学习(七)之 列表界面数据展示
一.前言 昨晚可能是因为更新完文章后,导致过于兴奋睡不着(写代码确实太容易让人兴奋了),结果两点多才睡着,大东北果然还是太冷了. 不知道是不是因为膝盖和脚都是冰凉的,所以才导致很晚才能入睡? 刚眯了一 ...
- bash反弹shell
part1:不求甚解的本地复现 攻击端Debian 10.x: 192.168.208.134 受害端Ubuntu : 192.168.208.135 攻击端打开(监听)某端口: 键入命令:[nc ...
- python打印爱心
print('\n'.join([''.join([('AndyLove'[(x-y)%8]if((x*0.05)**2+(y*0.1)**2-1)**3-(x*0.05)**2*(y*0.1)**3 ...
- camera HSYNC:VSYNC
HSYNC:行锁存,换行信号VSYNC:祯锁存,换页信号 320×240的屏,每一行需要输入320个脉冲来依次移位.锁存进一行的数据,然后来个HSYNC 脉冲换一行:这样依次输入240行之后换行同时来 ...
- 常用Java API:HashMap 和 TreeMap
摘要 本文主要介绍Map接口下的HashMap和TreeMap. HashMap HashMap是基于哈希表的 Map 接口的实现,是无序的 clear()//清空. containsKey(Obje ...
- ASP.NET MVC 中使用 jQuery 实现异步搜索功能
常见的几种异步请求方式: Ajax.BeginForm 异步提交文本的形式 Ajax.ActionLinkk 文本链接的形式 Client Validataion 客户端的认证 一.用jQuer ...
- 链式A+B 牛客网 程序员面试金典 C++ Python
链式A+B 牛客网 程序员面试金典 C++ Python 题目描述 有两个用链表表示的整数,每个结点包含一个数位.这些数位是反向存放的,也就是个位排在链表的首部.编写函数对这两个整数求和,并用链表形式 ...