题意:
给整数 n,求所有满足长度为 n 的 01 串的逆序对之和
解法:
求出所有串的逆序对,再累加显然是不行,可以发现取两个位置构成逆序对的数量和其他位置是没有关系的,所以我们先找两个位置,然后前面的位置1,后面的位置0,其他位置任意放,这就是这两个位置构成逆序对的总数
考虑到这样枚举里面一定会有重复的 01 串,但由于我们求的是不同位置对逆序对的贡献,所以重复的 01 串也是没有关系的
所以答案就是
注意取模
代码:
#include <bits/stdc++.h> #define ll long long #define sc scanf #define pr printf using namespace std; const ll mod = 1e9 + 7; const ll inv2 = (mod + 1) / 2; ll power(ll a, ll b) { ll res = 1; while (b) { if (b & 1) res = res * a % mod; a = a * a % mod; b >>= 1; } return res; } int main() { ll n; sc("%lld", &n); if (n < 2) pr("0"); else { ll ans = n % mod * ((n - 1 + mod) % mod) % mod * inv2 % mod * power(2, n - 2) % mod; pr("%lld\n", ans); } }