3 条题解

  • 0
    @ 2024-9-15 22:12:26

    为了解决这个问题,我们需要理解题目中的烦躁度计算方式,并将其转化为代码。对于每个位置 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
    上传者