题目传送门

题目大意:对于给定字符集大小k,求有多少个字符串满足它的最长【既是子串又是弱子序列】的长度为w;

神仙计数题

打表发现,对于字符串S而言,它的最长【既是子串又是弱子序列】,一定存在一个对应的子串,是S的前缀或者后缀

如果不是前缀或者后缀,那么它一定还可以向两边扩展

这启示我们分类讨论

容易发现,最优的情况一定是除了最后一位以外,其它每个字符都在相同的位置取,最后一位在其他位置取来构成弱子序列。

我们重点考虑最后一位带来的影响,

假设现在我们找到了一个字符串$w$作为子串,在后面接上一段字符串$L$

我们要保证$w$是最长的【既是子串又是弱子序列】才能正确地统计答案

1.$L$中一定存在一个字符和第$w$个字符相等

2.$L$中每个字符都不相等,否则继续向前取还能更长

3.前$L$个字符互不相等,否则从后面开始取能更长

有了这三个条件,我们就可以开始讨论了:

1.$w-L\geq 2$时,把序列分成5块,$[1,L], L+1, [L+2,w-1], w, [w+1,w+L]$

$[1,L]$存在一个字符和第L+1位相等,$[w+1,w+L]$位存在一个字符和第$w$位相等,两种情况取交集,可得答案为:

$k^{w-L-2}((A_{k}^{L})^{2}k^{2}-(A_{k}^{L+1})^{2})$

中间$w-L-2$个随便取,两边$L$个分别从$k$个里取且互不相等,第$L+1$个和第$w$个先假设随便取,再去掉两边都没有相同的情况

2.$w-L=1$时,把序列分成3块,$[1,L], w, [w+1,w+L]$

$[1,L]$位存在一个字符和第$w$位相等,$[w+1,w+L]$位存在一个字符和第$w$位相等,取交集,答案为:

$k(A_{k}^{L})^{2}-A_{k}^{L+1}A_{k-1}^{L}$

比上面的情况还要简单,不解释了

3.$w\leq L$时,把序列分成5块,$[1,w-1], w, [w+1,L], L+1, [L+2,L+w]$

这种情况就比较复杂了,但大体思路不变

首先,中间$[w+1,L]$一共$L-w$个,是从$k$个里随便取的且互不相同,贡献是$A_{k}^{L-w}$

左右两边$w$个都是从$k-(L-w)$里随便取,贡献是$A_{k-(L-w)}^{w}$

两边都没有的情况的贡献呢?

$w, [w+1,L], L+1$都互不相同,贡献是$A_{k}^{L-w+2}$。前后$w-1$个都和中间$[w,L+1]$个互不相同,贡献是$A_{k-(L-w+2)}^{w-1}$

总贡献就是$A_{k}^{L-w}(A_{k-(L-w)}^{w})^{2}-A_{k}^{L-w+2}(A_{k-(L-w+2)}^{w-1})^{2}$

$L$里每个元素互不相同,所以长度最大就是$k$,暴力枚举然后计算即可

 #include <cstdio>
#include <cstring>
#include <algorithm>
#define ll long long
#define N1 1000010
using namespace std;
const ll p=; ll mul[N1],_mul[N1],inv[N1];
int m,K,n;
inline ll C(int x,int y)
{
if(y>x) return ;
return mul[x]*_mul[y]%p*_mul[x-y]%p;
}
inline ll A(int x,int y)
{
if(y>x) return ;
return mul[x]*_mul[x-y]%p;
}
ll qpow(ll x,ll y)
{
if(y<) return ; ll ans=;
for(;y;x=x*x%p,y>>=) if(y&) ans=ans*x%p;
return ans;
} int main()
{
scanf("%d%d%d",&m,&K,&n);
int i,j,L;
mul[]=mul[]=_mul[]=_mul[]=inv[]=inv[]=;
for(i=;i<=K;i++) mul[i]=mul[i-]*i%p, inv[i]=1ll*(p-p/i)*inv[p%i]%p, _mul[i]=_mul[i-]*inv[i]%p;
ll ans=;
for(L=;L<=K&&n+L<=m;L++)
{
if(n-L>=) (ans+=qpow(K,n-L-)*(1ll*K*K%p*A(K,L)%p*A(K,L)%p-A(K,L+)*A(K,L+)%p+p)%p)%=p;
else if(n-L==) (ans+=(1ll*K*A(K,L)%p*A(K,L)%p-A(K,L+)*A(K-,L)%p+p)%p)%=p;
else (ans+=(1ll*A(K,L-n)*A(K-(L-n),n)%p*A(K-(L-n),n)%p-A(K,L-n+)*A(K-(L-n+),n-)%p*A(K-(L-n+),n-)%p)%p)%=p;
}
printf("%lld\n",(ans%p+p)%p);
return ;
}

CF135E Weak Subsequence (计数问题)的更多相关文章

  1. @property中的copy.strong.weak总结

    1.NSString类型的属性为什么用copy NSString类型的属性可以用strong修饰,但会造成一些问题,请看下面代码 #import "ViewController.h" ...

  2. [LeetCode] Arithmetic Slices II - Subsequence 算数切片之二 - 子序列

    A sequence of numbers is called arithmetic if it consists of at least three elements and if the diff ...

  3. [LeetCode] Is Subsequence 是子序列

    Given a string s and a string t, check if s is subsequence of t. You may assume that there is only l ...

  4. [LeetCode] Wiggle Subsequence 摆动子序列

    A sequence of numbers is called a wiggle sequence if the differences between successive numbers stri ...

  5. [LeetCode] Increasing Triplet Subsequence 递增的三元子序列

    Given an unsorted array return whether an increasing subsequence of length 3 exists or not in the ar ...

  6. [LeetCode] Longest Increasing Subsequence 最长递增子序列

    Given an unsorted array of integers, find the length of longest increasing subsequence. For example, ...

  7. weak和nonull

    weak和nonull是相互排斥的,所以weak和null不能同时使用,如下图:

  8. iOS中assign,copy,retain之间的区别以及weak和strong的区别

    @property (nonatomic, assign) NSString *title; 什么是assign,copy,retain之间的区别? assign: 简单赋值,不更改索引计数(Refe ...

  9. 动态规划求最长公共子序列(Longest Common Subsequence, LCS)

    1. 问题描述 子串应该比较好理解,至于什么是子序列,这里给出一个例子:有两个母串 cnblogs belong 比如序列bo, bg, lg在母串cnblogs与belong中都出现过并且出现顺序与 ...

随机推荐

  1. zippo打火机的特点:

    1.  耐寒.零下30多度环境下仍然能打火 2.抗压.被1.5吨的汽车压过之后仍然能打火 3.抗风,在7级下面的风速中火焰都不会熄灭 4.防水,放入水中.取出来之后任然能打火

  2. ubuntu中eclipse无法识别android手机问题

    1.问题: 在ubuntu中eclipse中用真机来调试androi程序时,发现无法识别手机,例如以下图显示2.37一栏之前显示全是乱码.这是解决后截的图. 2.问题原因: 在window下我们能够通 ...

  3. 深入分析JavaWeb Item47 -- Struts2拦截器与文件上传下载

    一.struts2中的拦截器(框架功能核心) 1.过滤器VS拦截器 过滤器VS拦截器功能是一回事. 过滤器是Servlet规范中的技术,能够对请求和响应进行过滤. 拦截器是Struts2框架中的技术. ...

  4. spring与springboot中,如何在static方法里使用自动注入的属性

    第一步:写注解@Component 使当前类成为一个bean对象.(@Controller,@service都行) 第二步:写个static的变量 第三步:写个@PostConstruct注解注解注释 ...

  5. The Elder HDU - 5956

    /* 树上斜率优化 一开始想的是构造出一个序列 转化成一般的dp但是可能被卡 扫把状的树的话可能变成n*n 其实可以直接在树上维护这个单调队列 dfs虽然搞得是一棵树,但是每次都是dfs到的都是一个序 ...

  6. bzoj 3598 [ Scoi 2014 ] 方伯伯的商场之旅 ——数位DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3598 数位DP...东看西看:http://www.cnblogs.com/Artanis/ ...

  7. mount -o remount,rw /

    init=/bin/sh mount -o remount,rw /; sed -i 's/指定字符串/&希望插入的字符串/' 文件 在一文件中指定的字符后插入内容 sed -i 's/指定的 ...

  8. Ruby类扩张(extension)

    创建: 2017/09/07 更新: 2017/09/16 修改标题字母大小写 ruby ---> Ruby    扩张类  class 类名     扩张的内容  end           ...

  9. ecshop类的解析2 json_encode和json_decode的具体实现

    在看ecshop源码时,看到json这个类,研究了一下,它是为了兼容低版本php而做出的类,是对php的数据和json转换时使用的. encode和decode函数是对json的操作,对应json_e ...

  10. DNS(域名系统)

    DNS(Domain Name System),因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的Ip数串.通过主机名,最终得到该主机 ...