题意:

给整数 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);
	}
}