c++98解决这个问题,给出代码现有一个包含n个元素的数组a,需要在数组a里面选出下标不同的两个元素ai和aj(不区分先后顺序),计算(ai + j)(aj + i),并把所有情况对应的结果相加。请你求出最终得到的总和,除以10007的余数。(提示:将所求的结果用和式表示,并进行化简) 【输入格式】 第一行一个正整数n(n≤100000),表示数组a的元素个数。 第二行n个整数,表示数组a的每一个元素(元素的值在1到100之间)。 【输出格式】 一个正整数,表示题目所求的余数。 【输入样例1】 3 1 2 3 【输出样例1】 50 【输入样例2】 4 2 7 1 2 【输出样例2】 159
时间: 2024-03-03 09:49:37 浏览: 177
以下是C++98版本的代码实现:
```cpp
#include <iostream>
#include <algorithm>
using namespace std;
const int MOD = 10007;
int main()
{
int n;
int a[100010];
cin >> n;
for(int i = 0; i < n; i++)
cin >> a[i];
sort(a, a + n); // 将数组排序
int sum1 = 0, sum2 = 0;
for(int i = 0; i < n - 1; i++)
{
sum1 = (sum1 + a[i]) % MOD; // 计算前缀和
sum2 = (sum2 + a[i + 1]) % MOD; // 计算后缀和
}
int ans = 0;
for(int i = 0; i < n - 1; i++)
{
// 计算每个(ai + j)(aj + i)的值
int res = (a[i] * (i + 2) % MOD * sum2 % MOD + a[i + 1] * (n - i - 1) % MOD * sum1 % MOD) % MOD;
ans = (ans + res) % MOD; // 将每个结果相加
}
cout << ans << endl;
return 0;
}
```
思路:将数组a排序,计算前缀和和后缀和,然后遍历数组,计算每个(ai + j)(aj + i)的值,并将每个结果相加,最终得到的总和即为所求的结果。
阅读全文