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

有帮助,赞一个