CF135E Weak Subsequence (计数问题)
题目大意:对于给定字符集大小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 (计数问题)的更多相关文章
- @property中的copy.strong.weak总结
1.NSString类型的属性为什么用copy NSString类型的属性可以用strong修饰,但会造成一些问题,请看下面代码 #import "ViewController.h" ...
- [LeetCode] Arithmetic Slices II - Subsequence 算数切片之二 - 子序列
A sequence of numbers is called arithmetic if it consists of at least three elements and if the diff ...
- [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 ...
- [LeetCode] Wiggle Subsequence 摆动子序列
A sequence of numbers is called a wiggle sequence if the differences between successive numbers stri ...
- [LeetCode] Increasing Triplet Subsequence 递增的三元子序列
Given an unsorted array return whether an increasing subsequence of length 3 exists or not in the ar ...
- [LeetCode] Longest Increasing Subsequence 最长递增子序列
Given an unsorted array of integers, find the length of longest increasing subsequence. For example, ...
- weak和nonull
weak和nonull是相互排斥的,所以weak和null不能同时使用,如下图:
- iOS中assign,copy,retain之间的区别以及weak和strong的区别
@property (nonatomic, assign) NSString *title; 什么是assign,copy,retain之间的区别? assign: 简单赋值,不更改索引计数(Refe ...
- 动态规划求最长公共子序列(Longest Common Subsequence, LCS)
1. 问题描述 子串应该比较好理解,至于什么是子序列,这里给出一个例子:有两个母串 cnblogs belong 比如序列bo, bg, lg在母串cnblogs与belong中都出现过并且出现顺序与 ...
随机推荐
- 查看scn headroom变化趋势的几种方法
查看scn headroom变化趋势的几种方法 scn headroom问题,本文不做解释. 本文为自己的总结,脚本来自于oracle sr技术project师. 转载请注明出处http://blog ...
- Base Class Doesn't Contain Parameterless Constructor?
http://stackoverflow.com/questions/7689742/base-class-doesnt-contain-parameterless-constructor #regi ...
- 杂项:ASP.NET Web API
ylbtech-杂项:ASP.NET Web API ASP.NET Web API 是一种框架,用于轻松构建可以访问多种客户端(包括浏览器和移动设备)的 HTTP 服务. ASP.NET Web A ...
- hdu3555Bomb(数位dp)
Bomb Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)Total Submi ...
- css3 选择器 权重问题 (第二部分)
这篇博文有关css的权重问题,我个人认为这是css知识中很重要的一个知识点.因为在开发的过程能中我们会经常遇到这种问题,特别是如果你使用框架的时候,有些框架的某些标签有一些默认的样式.所以我们可以通过 ...
- java 关键字与保留字
Java 关键字列表 (依字母排序 共51组),所有的关键字都是小写,在MyEclipse中都会显示不同的颜色: abstract, assert,boolean, break, byte, case ...
- gdb打印vector
1.gdb版本大于7.0 (gdb) p yourVector 2.打印整个vector (gdb) p *(yourVector._M_impl._M_start)@yourVector.size( ...
- 另一种压缩图片的方法---Machine learning 之 PCA(Principle Component Analysis)
PCA最主要的用途是用来减少特征向量的数目,N个特征向量 减小到 K个特征向量.如果为了可视化,k可以使3 或者 2.这样可以加速算法的学习速度. PCA用来压缩图像同一有效. 具体方式以及原理在gi ...
- JQuery 使用.show()和.hide()做的可爱动画
只是最基本的东西,没啥稀奇的,只是今天看jquery教程的时候偶然看到show()和hide()是可以写两个参数的, 第一个参数是元素隐藏/显示的速度(单位:毫秒),另一个是一个function类型. ...
- PHP获取远程和本地文件信息(汇总)
1.PHP filesize() 函数filesize() 函数返回指定文件的大小.若成功,则返回文件大小的字节数.若失败,则返回 false 并生成一条 E_WARNING 级的错误. 但是只能获取 ...