萌熊3月S题解

A

如果想要 \(i\) 成为 \(\verb!mex!\),那么 \(0\)\(i-1\) 的数都要选上,\(i\) 不选,而 \(>i\) 的乱选就可以了。

我们分别从 \(0\)\(k\) 考虑每个 \(i\) 成为 \(\verb!mex!\) 的情况(为什么是 \(0\)\(k\)?很显然,要是 \(i>k\) 的话前面就凑不出来完整的 \(0\)\(i-1\) 了),也就是从 \(n-1-i\) 个数中选 \(k-i\) 个,即 \(C(n-i-1,k-i)\)

最后还要算上普通情况,就是开局从这些数中选 \(k\) 个,即乘上 \(C(n,k)\)

求组合数的时候可以用逆元解,但还特判一些情况,例如 \(k=n\) 时,答案为 \(0\) 等等。

B

这题我是用乱搞做法(肯定不是正解),要听正解可以看官方的

遇到这种题先暴力打表找规律。

写一个十重循环不难得出以下的表:

image

然后把他交上去就有 \(20\) 分的好成绩。

现在开始找规律:

这种题大部分都是逆元、快速幂乘起来,所以我们考虑将一个大数分解质因数,再找规律,这里可以找同一行/列的。

比如第四行第五列的 \(10350\),分解出来就是 \(2\times 3^2 \times 5^2 \times 23\)

第五行第五列的 \(86250\) 分解出来就是 \(2\times 3\times 5^4 \times 23\)

第六行第五列的 \(646875\) 分解出来就是 \(3^2 \times 5^5\times 23\)

发现这三个数都有个 \(23\),而且跟第一行第五列的 \(69\)\(3\) 的倍关系,去掉 \(23\)\(3\),现在 \(10350\) 还剩下 \(\{2,3,5,5\}\)\(86250\) 还剩下 \(\{2,5,5,5,5\}\)\(646875\) 还剩下 \(\{3,5,5,5,5,5\}\)

三个数中还有这么多个 \(5\),那就把 \(5\) 也去掉一部分注意不能全去掉 \(5\),不然后面就没规律可以找了。

第四行的数剩了两个 \(5\),第五行的数剩了四个 \(5\),第六行的数剩了五个 \(5\),也就是说,他们至少还存在着 \(n-2\)\(5\),把这些 \(5\) 也去掉:

分别剩下 \(\{2,3\}\)\(\{2,5\}\)\(\{3,5\}\),乘起来得出 \(6,10,15\),发现这就是 \(\dfrac{n\times (n-1)}{2}\)\(n\) 是行数,在这里分别是 \(4,5,6\))。

然后就做完了?

整理一下,答案就是 \(a_m\times \dfrac{n\times (n-1)}{2}\times m^{n-2}\),这个 \(a_m\) 代表第二行的数组。

\(a\) 数组怎么求?zhx 讲过,不等差数列可以用若干个循环节数组,求若干次前缀和得出

\(\{1,2,4,2,4,2,4,...\}\)\(3\) 遍前缀和就得出了 \(\{1,5,16,36,69\}\),然后就做完了

C

类似诈骗题,原本想写个模拟结果直接冲了过去()

用两个栈,分别正序/倒序扫一遍数组,把所有符合 \(a_i>s.top\) 的数连一条从 \(a_i\)\(s.top\) 的边,并且 \(\verb!pop!\) 掉,一直到不满足为止。

因为正序倒序都来了一遍,所以可以通过这些边数来处理答案数组 \(vis\)\(vis_{i,j}\) 表示从 \(i\) 是否能到 \(j\)

根据传递闭包,从 \(i\)\(j\) 的和 \(j\)\(k\) 的可以推出 \(i\) 也能到 \(j\),所以直接把 \(vis_i\) 全部设为 \(1\)(大前提:要存在一条边),二维数组这么操作麻烦,考虑用 \(\verb!bitset!\),复杂度为 \(\dfrac{n}{32}\),最后判断 \(vis[a[p]][a[q]]\) 是否为 \(1\) 就行了。

总复杂度为 \(O(\dfrac{n^2}{32})\)

posted @ 2024-03-24 16:30  OoXiao_QioO  阅读(36)  评论(0编辑  收藏  举报