大数求和
2024-04-15 12:40:03
发布于:浙江
68阅读
0回复
0点赞
题意解析
对于题目中的式子,我们有 。
但是由于本题的 非常大,直接计算上面的式子时间复杂度为 ,计算量大概为 ,会超出时间限制。
我们考虑 。
而 ,即每 个数字的和对 取余的值为 。
令 ,我们只需要计算最后的 个数字的和即可。
而最后的 个数字的形式为 。
每个数字对 取余得到 。
对于本题 ,可以直接做整形运算。
对于 ,令其长度为 , 我们可以将其写成 ,其中 为其从低位到高位上的数字。那么我们便可以从逐位处理求得 。
AC代码
#include <bits/stdc++.h>
using namespace std;
using i64 = long long;
int main() {
cin.tie(nullptr)->sync_with_stdio(false);
int _; cin >> _;
while (_--) {
string s; cin >> s;
int m; cin >> m;
i64 res = 0;
for (auto &ch : s) {
res = res * 10 + ch - '0';
res %= m * 2;
}
res = (res + 1) * res / 2 % m;
cout << res << '\n';
}
return 0;
}
复杂度分析
求 的时间复杂度为 ;
计算 。的时间复杂度为 。
全部评论 1
啊???不用高精度?
2024-04-15 来自 广东
0哦用了一点但不多
2024-04-15 来自 广东
0之前想到了一点点,但是不会弄(
2024-04-15 来自 广东
0用高精求余就够了(虽然我自己赛时用了许多乱七八糟的方法。
2024-04-15 来自
0
有帮助,赞一个