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中都出现过并且出现顺序与 ...
随机推荐
- Android定时任务
前言 我们在平常的开发中可能会遇到一些需求,比如说,每日定时提醒,定时更新数据等等,反正就是周期性任务,碰到这类需求,我们就可以叫做定时任务.以前我们可以通过使用线程Handler来实现,现在既然是在 ...
- WinForm c# 备份 还原 数据库(Yc那些事儿 转)
Yc那些事儿 我愿意 为了我的幸福 奋斗终生 2008-11-17 18:04 WinForm c# 备份 还原 数据库 其实是个非常简单的问题,一个Form,一个Button,一个OpenF ...
- 【BZOJ 1601】 灌水
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1601 [算法] 最小生成树 [代码] #include<bits/stdc++ ...
- warning: here-document at line 7 delimited by end-of-file (wanted `rui')
- 83.个人信息维护页面 Extjs 页面
1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8" ...
- Stockbroker Grapevine(floyd)
http://poj.org/problem?id=1125 题意: 首先,题目可能有多组测试数据,每个测试数据的第一行为经纪人数量N(当N=0时, 输入数据结束),然后接下来N行描述第i(1< ...
- Java.Cas4.0客户端接入配置
1.本示例中使用cas4.0+cas-client-core3.4版本,ide则是myeclipse2014 blue版本,mvn使用3.9版本 2.注意事项:请先实现破解cas-client-cor ...
- mac下idea卡顿问题解决
idea在加载相对来说比较大的系统时,经常性出现卡顿,就是直接卡死,以至于写起代码特别难受. 最后找到的解决方案是修改idea.vmoptions中的内存大小 执行 find / -name idea ...
- centos 修改网卡信息命令
vi /etc/sysconfig/network-scripts/ifcfg-eth0
- iOS网络——NSURLCache设置网络请求缓存
今天在看HTTP协议,看到了response头中的cache-control,于是就深入的研究了一下.发现了iOS中一个一直被我忽略的类——NSURLCache类. NSURLCache NSURLC ...