萌熊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
这题我是用乱搞做法(肯定不是正解),要听正解可以看官方的
遇到这种题先暴力打表找规律。
写一个十重循环不难得出以下的表:
然后把他交上去就有 \(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})\)