P7322

好神仙!

\(\color{#5bc9}\text{提醒,本文有大量没有推到过程的式子,所以读者可以自己遮住先推一下}\)

Inscription:

有一个长度为 \(k\) 的窗口,在一个长度为 \(n\) 的序列 \(a\) 上滑动,请问滑动窗口中的数的 \(\min\) 共有多少种值。

Solution:

接下来我们考虑之后什么情况才会让答案 \(+1\)。

既然每次向右移动 \(1\) 的长度,那么只有可能删除的数或者新加入的数是最小值答案才有可能 \(+1\)。

对于最左边的数是窗口滑动之前是窗口最小值,进行一波推式子之后(此处省略一万行),可以发现它对答案的贡献有:

\[s1=\sum^{n-k}_{i = 1}C^{k-1}_{n-i} \times (n-k)! \times (k-1)! \times (n-k)
\]

解释一下:

其中从左往右,求和符合是枚举这个最小值的大小,组合数是令窗口中剩余的 \(k−1\) 个数大于最小值的值的个数。

两个阶乘分别是窗口外面的数任意排列和窗口内部除去最小值外任意排列。

最后一个 \(n−k\) 是计算排列中窗口可以在的位置有 \(n−k\) 个。

同理新加入的数的的贡献就为:

\[s2=\sum^{n-k}_{i = 1} C^{k}_{n-i} \times (n-k-1)! \times k! \times (n-k)
\]

但是未免有左右两边都是最小的情况,所以我们要减去。

所以需要减掉的部分为:

\[s3=\sum^{n-k}_{i = 1}C^{k-1}_{n-i} \times (n - k - 1)! \times (k - 1)! \times (n-k) \times (i-1)
\]

\(i−1\) 是最右边小于最左边的个数。

\(\color{violet} \text{注意:最后还需要加上每个排列都缺少的 1 答案,也就是总答案加上 n!}\)。

但是我不甘于 \(O(n-k)\) 的做法(除了预处理),于是就有了下面的事情。

我们来化简 \(s1,s2,s3\)(化简过程略,读者可以自己遮住先推一下)。

\[s1 = \sum^{n-k}_{i=1} \dfrac{n-k}{(n-k-i+1)!} \times (n-k)! \times (n-i)!
\]
\[s2 = \sum^{n-k}_{i=1} \dfrac{1}{(n-k-i)!} \times (n-k)! \times (n-i)!
\]
\[s3 = \sum^{n-k}_{i=1} \dfrac{i-1}{(n-k-i+1)!} \times (n-k)! \times (n-i)!
\]

然后呢,就有一个规律,那就是 \(s1 - s3 = s2\)。

所以答案从 \(s1 + s2 - s3 + n!\) 变成了 \(2 \times s2 + n!\)。

但是,我们还不满足。

\(s2\) 仍然可以化简(读者可以自己遮住先推一下)。

\[s2 = \dfrac{(n+1)!}{k+1} - n!
\]

所以把上面这个式子带入求答案的式子。

所以:

\[\dfrac{2 \times (n+1)!}{k+1} - n!
\]

所以完结撒花!!

最后贴上代码:

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int mod = 998244353;
int qpow(int a,int b)
{
int res = 1;
while(b)
{
if(b & 1)
{
res = res * a % mod;
}
b >>= 1;
a = a * a % mod;
}
return res;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int n,k;
cin >> n >> k;
int fac = 1;
for(int i = 1;i <= n;i++)
{
fac = fac * i % mod;
}
cout << (2 * (fac * (n + 1) % mod) * qpow(k + 1,mod - 2) % mod - fac + mod) % mod;
return 0;
}

随机推荐

  1. three.js实现数字孪生3D仓库一期(开源)

    大家好,本文使用three.js实现了3D仓库一期项目,给出了代码,分析了关键点,感谢大家~ 关键词:数字孪生.three.js.Web3D.WebGL.智慧仓库.开源 代码:Github 我正在承接 ...

  2. 力扣68(java)-文本左右对齐(困难)

    题目: 给定一个单词数组 words 和一个长度 maxWidth ,重新排版单词,使其成为每行恰好有 maxWidth 个字符,且左右两端对齐的文本. 你应该使用 "贪心算法" ...

  3. SKG 渠道中台借助 SAE + 大禹打造云原生 DevOPS,提效 60%

    简介: 新零售标杆 SKG 全面拥抱 Serverless,敏捷交付! 作者:陈列昂(SKG).昕辰.龙琛.黛忻 项目背景 未来穿戴健康科技股份有限公司(SKG)是一家专注为个人与家庭提供智能可穿戴健 ...

  4. iofsstat:帮你轻松定位 IO 突高,前因后果一目了然 | 龙蜥技术

    ​简介:磁盘被打满到底是真实的业务需求量上来了呢?还是有什么野进程在占用 IO? iofsstat 帮你精准定位. 编者按:sysAK(system analyse kit),是龙蜥社区系统运维 SI ...

  5. 如何高效学习 Kubernetes 知识图谱?

    ​简介: Kubernetes 知识图谱遵循云原生人才学习路径搭建课程体系框架,及人才发展路线设置不同阶段,由浅入深,帮助云原生人才学习容器基础.Kuternetes 网络.存储.资源对象.服务发现. ...

  6. Git 工具下载慢问题 & 图像化界面工具

    Git 命令行淘宝镜像:git-for-windows Mirror (taobao.org) Git 图形客户端:Download – TortoiseGit – Windows Shell Int ...

  7. [Go] godoc 打开本地文档, windows 同样适用

    godoc 提供了在无网环境下 浏览官方文档的便利. 示例: $ go get golang.org/x/tools/cmd/godoc $ godoc -http=localhost:6060 Li ...

  8. [PHP] 浅谈 Laravel 三大验证方式的区别, auth:api, passport, auth:airlock

    auth:api 最先出来,提供了最简单和最实用的方式进行 api 身份校验. 关于它的含义和用法你可以参考以下两篇: 浅谈 Laravel Authentication 的 auth:api 浅谈 ...

  9. 四:海思Hi3516CV500/Hi3516DV300

    Hi3516CV500 和 Hi3516DV300 均是海思推出的 IP Camera  SoC [System-on-a-Chip:SoC芯片是一种集成电路的芯片] 芯片. 针对海思 HI3516D ...

  10. LVS负载均衡(6)--LVS调度算法详解

    目录 1. LVS调度算法详解 1.1 静态调度算法 1.1.1 RR调度算法 1.1.2 WRR调度算法 1.1.3 SH调度算法 1.1.4 DH调度算法 1.2 动态调度算法 1.2.1 LC调 ...