题意:
给整数 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);
}
} 
京公网安备 11010502036488号