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中都出现过并且出现顺序与 ...
随机推荐
- java 效率编程 的一些小知识点
1.在程序中若出现字符串连接的情况.请使用StringBuffer取代String,这样能够降低多次创建String以及垃圾回收所带来的内存消耗 2.尽量使用局部变量. 调用方法时传递的參数以及调用中 ...
- 我的Android进阶之旅------>Android中ListView中嵌套(ListView)控件时item的点击事件不起作的问题解决方法
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvb3V5YW5nX3Blbmc=/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...
- 【九章算法免费讲座第一期】转专业找CS工作的“打狗棒法”
讲座时间: 美西时间6月5日18:30-20:00(周五) 北京时间6月6日09:30-11:00(周六a.m) 讲座安排: 免费在线直播讲座 报名网址: http://t.cn/R2XgMSH,或猛 ...
- C# openfiledialog对文本框的操作//C#中OpenFileDialog的使用
在WebForm中提供了FileUpload控件来供我们选择本地文件,只要我们将该控件拖到页面上了,就已经有了选择本地文件的功能了.而在WinForm中,并没有为我们提供集成该功能的控件,但为我们提供 ...
- mysql数据库操作(3)
1.在查询结果中不显示重复记录 查询时不显示重复记录主要应用了 DISTINCT 关键字,该关键字用于删除重复记录. 在实现查询操作时,如果查询的选择列表中包含一个表的主键,那么每个查询中的记录都将是 ...
- bzoj3555 [Ctsc2014]企鹅QQ——字符串哈希
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3555 很久以前就讲过哈希,但一直没写过题,所以这是哈希第一题! 哈希就是把一个字符串映射成一 ...
- 第14课 SourceTree程序操作介绍
http://www.atlassian.com/software/sourcetree/overview https://www.microsoft.com/net/framework/versio ...
- Pie(二分)
http://poj.org/problem?id=3122 题意:将n个圆柱体的不同口味的pie分给m个人,要求每个人分得的pie必须体积相同,且来自于一块pie(即:只分得一种口味的pie),求最 ...
- php循环跳出
PHP中的循环结构大致有for循环,while循环,do{} while 循环以及foreach循环几种,不管哪种循环中,在PHP中跳出循环大致有这么几种方式: 代码: <?php $i = 1 ...
- Python 30 单例模式
单例模式 多次实例化的结果指向同一个实例 单例模式实现方式 import settings #方式一: class MySQL: __instance=None def __init__(self,i ...