A-F题解

altalt

A 牛牛的串串

模拟

​ 按题意模拟即可。

https://ac.nowcoder.com/acm/contest/view-submission?submissionId=79078845

B 牛牛的合数

数论、分类讨论

​ 若 为奇数,那么 的二进制下最后一位一定为 1 ,将 异或 1 后,一定会得到二进制下最后一位为 0 的数字,也就是偶数。并且这个数一定等于

​ 若 为偶数,那么 的二进制下最后一位一定为 0 ,将 异或 2 后,一定会得到二进制下最后一位为 0 的数字,也就是偶数。并且这个数一定等于

​ 因此,归纳一下,若 ,按上述方式一定可行。若 ,可以发现 ,是个合数。若 ,手推一下会发现一定无解。

https://ac.nowcoder.com/acm/contest/view-submission?submissionId=79079108

C 牛牛的排列

构造

​ 首先有一个重要的结论:

​ 那么,如果 为奇数,直接输出 就可以了,总和为 ,是偶数。

​ 再引入两个结论:

​ 根据这两个结论,若 为偶数,我们可以构造出 。 2 到 中共有 个数,由于 是偶数, 也是偶数,因此中间部分总和为 ,根据上面引入的两个结论, ,最终总和为 ,是偶数。

https://ac.nowcoder.com/acm/contest/view-submission?submissionId=79079399

D 牛牛的子序列

模拟

​ 首先可以将一个数组写成另一种形式,例如:将 写成 ,将 写成

​ 为了方便描述,我们定义改写后的数组中括号外的数字为**“元素”,括号内的数字为元素“指数”**,且后续的数组都是被改写后的。

​ 若是 数组可以变成 数组,必须满足数组长度相同,并且每一个位置元素都相同,且 数组中的指数小于等于 数组中的指数

​ 一次操作最多可以使得 数组中的每一个指数 变成 之间的任意一个数字,因此我们在不超过 数组指数的情况下贪心考虑变成最大值。

https://ac.nowcoder.com/acm/contest/view-submission?submissionId=79080572

E 牛牛的约数

暴力

​ 写了个看上去是 的代码,过了。

​ 查表后发现复杂度是一个常数,大概是

​ 大致思路就是,将数组去重并排序,然后对于每一个数,从它往前暴力,找到了就break,否则就是无解。

更新:时间复杂度应该是 左右,其中 为值域。

https://ac.nowcoder.com/acm/contest/view-submission?submissionId=79081697

F 牛牛的三角形

DP、组合数学

​ 首先考虑怎么样的数组无法构造三角形,一个很容易想到的数组是: ,可以发现是一个斐波那契数列,那就意味着在 1500 内,这个数组的数字数量不会太多。

考虑DP, dp[i][j][k] 表示数组中有 i 个数,次大的为 j ,最大的为 k 的方案数。
l = j + k
dp[i][j][k] -> dp[i + 1][k][l, l + 1, l + 2, ..., n]

​ 暴力转移是

​ 观察可以发现,这实际上是一个区间加,可以用数据结构(如线段树)优化成

​ 再观察可以发现,我们只需要查询一次,因此可以使用差分进一步优化

​ 第一维(也就是数字个数)取 20 以内即可。

​ 最后的时间复杂度为

https://ac.nowcoder.com/acm/contest/view-submission?submissionId=79083929