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

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

#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 
}
2 回复 0 转发 0 喜欢 5 阅读
回复 (2)
默认 最新
露米 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