考虑求任意序列中$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的更多相关文章

  1. Atcoder 乱做

    最近感觉自己思维僵化,啥都不会做了-- ARC103 F Distance Sums 题意 给定第 \(i\) 个点到所有点的距离和 \(D_i\) ,要求构造一棵合法的树.满足第 \(i\) 个点到 ...

  2. 【AtCoder】ARC100 题解

    C - Linear Approximation 找出\(A_i - i\)的中位数作为\(b\)即可 题解 #include <iostream> #include <cstrin ...

  3. ARC 100

    链接 https://arc100.contest.atcoder.jp/ C Linear Approximation 题解 把ai减去i后排序, 我们要的b就是排完序后的中位数 Code #inc ...

  4. AtCoder Regular Contest 100

    传送门 C - Linear Approximation 题意: 求 \[ \sum_{i=1}^nabs(A_i-(b+i)) \] \(A_i,b\)给出. 思路: 将括号拆开,变为\(A_i-i ...

  5. AtCoder练习

    1. 3721 Smuggling Marbles 大意: 给定$n+1$节点树, $0$为根节点, 初始在一些节点放一个石子, 然后按顺序进行如下操作. 若$0$节点有石子, 则移入盒子 所有石子移 ...

  6. [LeetCode] Repeated DNA Sequences 求重复的DNA序列

    All DNA is composed of a series of nucleotides abbreviated as A, C, G, and T, for example: "ACG ...

  7. [Leetcode] Repeated DNA Sequences

    All DNA is composed of a series of nucleotides abbreviated as A, C, G, and T, for example: "ACG ...

  8. 论文阅读(Weilin Huang——【AAAI2016】Reading Scene Text in Deep Convolutional Sequences)

    Weilin Huang--[AAAI2016]Reading Scene Text in Deep Convolutional Sequences 目录 作者和相关链接 方法概括 创新点和贡献 方法 ...

  9. 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 ...

随机推荐

  1. openssl 生成证书上 grpc 报 legacy Common Name field, use SANs or temporarily enable Common Name matching with GODEBUG=x509ignoreCN=0

    最近用传统的方式 生成的证书上用golang 1.15. 版本 报 grpc 上面 ➜ ~ go version go version go1.15.3 darwin/amd64 上面调用的时候报错了 ...

  2. 阿里云 Serverless 再升级,从体验上拉开差距

    差距都在细节上. Serverless 要成就云计算的下一个 10 年,不仅需要在技术上持续精进,也需要在产品体验上精耕细作. 近日,阿里云 Serverless 再度升级,发布了一系列围绕产品体验方 ...

  3. Java领域的表现层的三种技术--jsp、freemarker、velocity

    10月份忙碌的参加秋招并获得了5个成都.上海.广州等不同地区的工作offer,最终选择了广州,11月底来到公司实习,很快,就跟进了公司的项目了,原本以为可以和宣讲会时报的志愿一样--Java开发,但是 ...

  4. C# 提取PDF中的表格

    本文介绍在C#程序中(附VB.NET代码)提取PDF中的表格的方法,调用Spire.PDF for .NET提供的提取表格的类以及方法等来获取表格单元格中的文本内容:代码内容中涉及到的主要类及方法归纳 ...

  5. 【数据结构与算法Python版学习笔记】树——二叉树的应用:解析树

    解析树(语法树) 将树用于表示语言中句子, 可以分析句子的各种语法成分, 对句子的各种成分进行处理 语法分析树 程序设计语言的编译 词法.语法检查 从语法树生成目标代码 自然语言处理 机器翻译 语义理 ...

  6. 2020BUAA软工提问回顾和个人总结作业

    2020BUAA软工提问回顾和个人总结作业 17373010 杜博玮 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 提问回顾和个人总结作业 我在 ...

  7. redis5集群搭建步骤

    通常情况下为了redis的高可用,我们一般不会使用redis的单实例去运行,一般都会搭建一个 redis 的集群去运行.此处记录一下 redis5 以后 cluster 集群的搭建. 一.需求 red ...

  8. SDIO总线协议

    SDIO采用HOST-DEVICE模式,所有通信都由HOST端发命令,DEVICE设备只要解析HOST命令就可与HOST进行通信. SDIO总线的几根线: 1.  CLK信号:HOST给DEVICE的 ...

  9. 嵌入式STM32的GPIO口工作模式的介绍

    一.输入模式 1. 浮空输入 浮空输入模式下,上拉和下拉两个开关断开,高或低电平通过施密特触发器到达输入数据寄存器,CPU可以通过读取输入数据寄存器从而读取到外部输入的高低电平值. 2. 输入上拉模式 ...

  10. 深入理解Linux C语言内存管理

    问题不能拖,我这就来学习一下吧,争取一次搞定. 在任何程序设计环境及语言中,内存管理都十分重要. 内存管理的基本概念 分析C语言内存的分布先从Linux下可执行的C程序入手.现在有一个简单的C源程序h ...