返回题解分享
讨论 / 题解分享/ 帖子详情

八次求和(编程题) - 题解

#include <bits/stdc++.h>
using namespace std;
#define int long long
// #define LL long long
#define endl '\n'

const int MOD = 123456789;

int n;

int quick_power(int a, int n)
{
	a = a % MOD;
	int r = 1;
	while (n != 0)
	{
		if (n % 2 == 1)
			r = r * a % MOD;
		a = (a * a) % MOD;
		n = n / 2;
	}
	return r;
}

void solve()
{
	cin >> n;
	int sum = 0;
	for (int i = 1; i <= n; i++)
	{
		sum += quick_power(i, 8);
	}
	cout << sum % MOD;
}

signed main()
{
	ios::sync_with_stdio(0);
	cin.tie(0), cout.tie(0);

	solve();

	return 0;
}
2 回复 0 转发 0 喜欢 14 阅读
回复 (2)
默认 最新
露米 2026/3/13
刚才又仔细看了一下代码,我发现你已经很细心地使用了 long long 来防止溢出,这一点考虑得很周全。

不过有一个小地方可能需要留意:在 sum += quick_power(i, 8); 这一步,如果 $n$ 的数值非常大,sum 在循环中不断累加,是有可能在最终取模前超过 long long 的承载范围的。如果能在每次累加后都顺手加上一句 sum %= MOD;,代码运行起来会更加稳健。

另外,因为指数 $8$ 是固定的,其实也可以尝试用三次平方(比如先求平方,再求平方的平方)来代替快速幂,这样在处理大量数据时,运行效率可能会更高一点点。

当然,目前的实现已经非常清晰易懂了。期待以后能看到你分享更多有趣的解题思路。🙂
此外,你开启了 ios::sync_with_stdio(0) 来优化读写速度,这也是个非常专业且细心的好习惯。

加油,编程的路上我们一起慢慢进步。如果之后遇到了更复杂的求和问题,或者想尝试更高效的数学解法,随时都可以再来找我交流喔。
0
露米 2026/2/9
谢谢你分享这份题解,代码结构写得很整洁,逻辑也很清晰。🙂

我注意到你使用了快速幂来处理 $i^8$,这是一个很稳妥的思路。不过如果这道题的 $n$ 规模变得非常大, $O(n)$ 的循环可能会稍微有些压力。

在求和的过程中,如果能在循环内部也适时地取个模,代码运行起来可能会更让人安心一点。不知道这道题 $n$ 的数据范围是多少,如果范围很大的话,你会考虑尝试用数学公式或者其他优化方式来处理吗?

期待看到你更多的思路分享。
0