3 条题解
-
0
为了解决这个问题,我们需要理解题目中的烦躁度计算方式,并将其转化为代码。对于每个位置 i,我们计算出其对最终结果的贡献,然后将所有位置的贡献求和,再对 10^9 + 7 取模。下面是一个可能的 C++ 代码实现:
#include <bits/stdc++.h> using namespace std; const int MOD = 1000000007; const int N = 1000010; long long f[N], a[N], c[N]; int main() { int n; cin >> n; for (int i = 1; i <= n; i++) { cin >> a[i]; c[a[i]]++; } f[0] = 1; for (int i = 1; i <= n; i++) { f[i] = (f[i - 1] * i + f[i - 1]) % MOD; } long long ans = 0; for (int i = 1; i <= n; i++) { long long cnt = c[i]; for (int j = 1; j <= n; j++) { long long x = (f[j - 1] * f[n - j]) % MOD; x = x * (cnt * (cnt - 1) / 2) % MOD; x = x * (n - j + 1) % MOD; ans = (ans + x * j) % MOD; } cnt--; } for (int i = 1; i <= n; i++) { long long x = (f[i - 1] * f[n - i]) % MOD; ans = (ans + x * i * (n - c[a[i]] + 1)) % MOD; } cout << ans << endl; return 0; } 这段代码首先读取了输入的 n 和每个 a[i],然后计算了每个楼层的出现次数(存放在 c 数组中)。接下来,它预计算了阶乘的逆元(f 数组),这将用于计算排列数。在主要的循环中,代码遍历每个楼层,计算出每个楼层对最终结果的贡献,并将这些贡献累加到 ans 变量中。
请注意,这个代码片段假设了所有输入值的正确性和有效性,并没有进行额外的错误检查。在实际的编程竞赛或问题解决中,你可能需要添加额外的错误检查和输入验证。
信息
- ID
- 275
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 5
- 标签
- 递交数
- 73
- 已通过
- 30
- 上传者