假设长度为n 位置x为0
那么此处产生的贡献应该是前面所有1的个数 乘以所有的排列总数
那x前的排列共有2 ^ (x - 1)种 总共出现的数字个数是(2 ^ (x - 1)) * (x - 1)
显然1和0等概率出现 那么前面的1的总个数为(x - 1) * (2 ^ (x - 2))
再考虑所有可能的排列种数 后面每个位置都可能是0或1 那么就是(2 ^ (n - x))
那么这一个点的贡献就为(x - 1) * (2 ^ (x - 2)) * (2 ^ (n - x)) = (x - 1) * (2 ^ (n - 2))
一共有x个点 对贡献中的x求和 得到总的贡献为 n * (n - 1) * (2 ^ (n - 3))
快速幂就解决了
注意 快速幂不能求指数为负的幂 所以n == 1,n == 2时要特判

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int p = 1e9 + 7;

ll qmi(ll a, ll b) {
  ll res = 1 % p;
  for (;b;b >>= 1) {
    if (b & 1) res = res * a % p;
    a = a * a % p;
  }
  return res;
}


int main () {
  ios::sync_with_stdio(0), cin.tie(0);
  ll n;cin >> n;
  if (n <= 1) cout << 0;
  else if (n == 2) cout << 1;
  else cout << ((n % p) * ((n - 1) % p)) % p * (qmi(2, n - 3) % p) % p;                                     
}