以下回答参考 皆我百晓生、券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。
这是一个使用动态规划的方法来解决这个问题。首先,我们需要定义一个二维数组dp
,其中每一行表示从当前元素开始的所有可能的组合。
然后,我们遍历整个数组,对于每个位置(即dp[i][j]
),我们可以计算出所有可能的结果,并将其累加到结果中。最后,我们将最终的结果除以p
并取模得到最终的答案。
以下是完整的C++代码:
#include <iostream>
using namespace std;
const int MOD = 1e9 + 7;
int main() {
int n, ans[100005];
cin >> n;
for (int i = 0; i <= n; ++i) {
cin >> ans[i];
}
long long t = 0;
for (int i = 1; i <= n; ++i) {
for (int j = i + 1; j <= n; ++j) {
for (int k = j + 1; k <= n; ++k) {
t = (t + ans[i] * ans[j] % MOD * ans[k] % MOD) % MOD;
}
}
}
cout << t % MOD;
return 0;
}
这段代码的时间复杂度为O(n^3),空间复杂度也为O(n^3)。