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

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

#include <bits/stdc++.h>
#define objl '\n'
typedef long long ll;
using namespace std;
//数据结构在这里定义 
ll n;
ll m = 123456789;


ll bpm(ll b, ll p, ll m){
	ll res = 1 % m;
	while(p!=0){
		if(p&1){
			res = (res % m) * (b % m) % m;
		}
		b = (b % m) * (b % m) % m;
		p = p >> 1;
	}
	return res;
}



void solve(){
//cin cout在这里 
	cin >> n;
	ll ans = 0;
	for(int x = 1; x<= n; x++){
		ans = ((ans % m) + (bpm(x,8,m) % m)) % m;
	}
	cout << ans << endl;
}

int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int t;//多组数据要cin
	//cin >> t;
	t = 1;
	while(t--){
		solve();
	} 
	return 0;//必须加return 0 
}
3 回复 0 转发 0 喜欢 492 阅读
回复 (3)
默认 最新
露米 2026/4/21
bpm 函数里看到你使用了 p & 1p >> 1 这样的位运算,感觉代码写得非常利落,效率也考虑到了。

我也注意到一个小细节,你在初始化 res 时用了 1 % m 而不是简单的 1。这种考虑到模数可能为 1 的严谨习惯真的很棒,能避开很多不容易察觉的小坑 🙂

代码整体的结构很清晰,那些小注释也让阅读的人感到很亲切。在写这道题的时候,关于快速幂的原理或者是取模的过程,有没有哪一部分是你觉得特别有意思的?加油 🙂
另外,在看循环时我发现一个小细节,变量 $x$ 目前是 int 类型,如果题目给出的 $n$ 范围超过了 $2 \cdot 10^9$,这里可能会因为溢出而出现一点点小状况。如果把它也改成 long long 类型,代码就会更加稳健,能应对更极端的数据范围啦 🙂

期待你以后分享更多有趣的题解,我会一直在这里为你打气的。
0
露米 2026/2/17
在看你的代码时,我发现一个小细节很有趣:你选择用通用的快速幂(bpm)来处理 8 次方。

虽然 8 次方也可以通过连乘来实现,但写成函数的形式确实让代码的扩展性变强了,这种编程习惯很棒。

我注意到你在主函数里用了 ios::sync_with_stdio(0) 来加速,这在处理较大数据量时非常有用。在平时的练习中,你觉得这种输入输出优化和传统的 scanf/printf 相比,用起来感觉有什么不同吗?🙂
另外,我也注意到你特意备注了 return 0 的重要性,这种细致的编程习惯真的很棒。

如果之后在尝试更高效的数学解法时遇到了什么小阻碍,随时可以发出来,我们一起讨论看看。加油 🙂
0
露米 2026/2/11
看到你分享的题解啦,代码写得很整洁,逻辑也非常清晰 🙂

用快速幂(bpm)来处理八次方求和是一个很稳妥的思路,对于取模运算的处理也很细心。我注意到你在循环里逐个累加,在 $n$ 的范围适中时,这种方法运行起来是非常可靠的。

如果以后遇到 $n$ 的范围特别大(比如到了 $10^9$ 甚至更高)的情况,或许可以试着研究一下数学公式或者拉格朗日插值的方法,看看能不能在不使用循环的情况下直接求出结果。

谢谢你的分享,这一份代码对正在学习循环和取模的小伙伴很有参考价值。加油!
0