update
This commit is contained in:
parent
abf7cf6a2d
commit
81df644f5a
5
day2/U111091/1.myans
Normal file
5
day2/U111091/1.myans
Normal file
@ -0,0 +1,5 @@
|
||||
54
|
||||
72
|
||||
0
|
||||
1
|
||||
0
|
BIN
day2/U111091/chat
Executable file
BIN
day2/U111091/chat
Executable file
Binary file not shown.
72
day2/U111091/chat.cpp
Normal file
72
day2/U111091/chat.cpp
Normal file
@ -0,0 +1,72 @@
|
||||
#include <iostream>
|
||||
#include <vector>
|
||||
|
||||
const int MOD = 1000000007;
|
||||
|
||||
// 快速幂计算
|
||||
long long mod_pow(long long base, long long exp, long long mod) {
|
||||
long long result = 1;
|
||||
while (exp > 0) {
|
||||
if (exp % 2 == 1) {
|
||||
result = (result * base) % mod;
|
||||
}
|
||||
base = (base * base) % mod;
|
||||
exp /= 2;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
// 计算前缀和
|
||||
void compute_prefix_sum(const std::vector<int>& array, std::vector<long long>& prefix) {
|
||||
int n = array.size();
|
||||
prefix[0] = 0;
|
||||
for (int i = 1; i <= n; ++i) {
|
||||
prefix[i] = (prefix[i - 1] + array[i - 1]) % MOD;
|
||||
}
|
||||
}
|
||||
|
||||
// 计算所有子区间平均数之和
|
||||
long long calculate_average_sum(int n, const std::vector<int>& array) {
|
||||
std::vector<long long> prefix(n + 1, 0);
|
||||
compute_prefix_sum(array, prefix);
|
||||
|
||||
// 预处理每个长度的逆元
|
||||
std::vector<long long> inverse(n + 1);
|
||||
for (int i = 1; i <= n; ++i) {
|
||||
inverse[i] = mod_pow(i, MOD - 2, MOD);
|
||||
}
|
||||
|
||||
long long total_avg_sum = 0;
|
||||
for (int l = 0; l < n; ++l) {
|
||||
for (int r = l; r < n; ++r) {
|
||||
long long subarray_sum = (prefix[r + 1] - prefix[l] + MOD) % MOD;
|
||||
int length = r - l + 1;
|
||||
long long avg = (subarray_sum * inverse[length]) % MOD;
|
||||
total_avg_sum = (total_avg_sum + avg) % MOD;
|
||||
}
|
||||
}
|
||||
|
||||
return total_avg_sum;
|
||||
}
|
||||
|
||||
int main() {
|
||||
int t;
|
||||
std::cin >> t;
|
||||
std::vector<long long> results;
|
||||
|
||||
while (t--) {
|
||||
int n;
|
||||
std::cin >> n;
|
||||
std::vector<int> array(n);
|
||||
for (int i = 0; i < n; ++i) {
|
||||
std::cin >> array[i];
|
||||
}
|
||||
results.push_back(calculate_average_sum(n, array));
|
||||
}
|
||||
|
||||
for (long long result : results) {
|
||||
std::cout << result << std::endl;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
Loading…
Reference in New Issue
Block a user