开头废话:
这份题解是我做了很久做出来的,好久没有做过这么高质的了。本题解是这道题第一份题解,绝对是这道题最高质的题解,看完绝对理解。
题目分析:
这道题第一眼看上去是需要使用列表来模拟,但其实并不需要。因为每次都只需要用到列表的最后一个值,所以我们可以只在 nnn 上面操作。同时因为题目要求输出列表的第 ididid 位数的值,所以我们的循环并不需要完全把 mmm 次的操作都实现,我们只需要操作到第 ididid 位就行了。
代码关键:
1 / 实现这道题目是一定的需要用到循环的,循环的范围却和普通的循环有些区别。上面说了,虽然题目让我们模拟 mmm 次,但是因为题目只求第 ididid 位的值,所以我们只需要循环到 ididid 次
* iii 表示第几次操作
* 需要执行 id−1id - 1id−1 次操作来得到第 ididid 个数
* 第 111 个数不需要操作,所以从 i=1i = 1i=1 开始
所以也可以写成:
这里无特殊要求,看自己的喜好来。
2 / 因为只循环到 ididid 次,所以这道题中的输入数据的 mmm 并没有用,我们完全可以不输入它,或者说直接不定义它,这样做可以不浪费资源。但是要注意输入的格式,有用的信息 ididid 在 mmm 前面,但是我们又不想浪费空间,那么便可以这么写:
因为两次输入了 ididid 所以后面一次的输入会把前一次的输入覆盖掉,这样写就可以实现我们的目标。
3 / 因为我们是直接在 nnn 上面操作的,所以要考虑数据范围的问题。作者亲测,如果不开 long long 会溢出,所以要开 long long。
4 / 循环内部的处理非常简单,但是怎么样才能做到简洁,高效呢?
普通写法:
这样写固然可以,但是如果想要进一步优化便可以使用三木运算符,像这样:
因为判断一个数是不是偶数的方法通常是看它能否被 222 整除,所以这里括号内的结果只能是 111 或 000,所以便可以使用三木运算符。
完整实现:
因为我个人是 C/C++C/C++C/C++ 的,所以我准备了两种类型的完整代码,大家按照自己的需要复制。
1 / C
2 / C++
个人非常追求完美和效率,不喜欢使用万能头,同时严格按照标准格式书写,空格是一个都少不了,某些人不要再说我是 AIAIAI 了!
结尾分析:
1 / 时间复杂度为 O(id)O(id)O(id) 这是可以接受的。如果数据特别大那么也可以考虑使用快速幂,但是这道题的数据范围很小,所以不需要。
2 / 空间复杂度为 O(1)O(1)O(1) 因为只定义了几个变量,所以就是这么小。
3 / 预计得分为 100100100 ptsptspts 我都 ACACAC 了,肯定 100100100。
看懂了点个赞,谢谢!!!