这是一道很明显的排列组合题

先看题,他叫我们求所有长度为n的01串的逆序对数之和

那么,我们可以考虑计算每个位置与它之前的位置所产生的贡献:

第1个位置一定不会与之前的位置产生贡献,所以可以不管

对于第x(x!=1)个位置,它要和它前面的位置产生贡献的话,那么这个位置上的数就一定得是0,而它前面的就一定得是1

我们考虑枚举第x个位置前面的有几个1,然后,计算出第i个位置产生的贡献,为:

不难发现,是常数,我们提取出来:

因为

所以原式变为:

所以原式变为:

因为由意义,

所以,

整理下:

由高斯求和:

注意到,这个式子可以直接求出,所以输出这个答案即可~

代码

#include<bits/stdc++.h>
using namespace std;
const int mod=1e9+7;
inline long long ksm(int x,long long y){
    int ans=1;
    while(y){
        if(y&1){
            ans=(1LL*ans*x)%mod;
        }
        x=(1LL*x*x)%mod;
        y>>=1;
    }
    return ans;
}
int main(){
    long long n,ans=0;
    cin>>n;
    long long L,R;
    if(n&1){
        L=n,R=(n-1)/2;
    }else{
        L=n/2,R=n-1;
    }
    L%=mod,R%=mod;
    L=(1LL*L*R)%mod;
    printf("%lld",(1LL*L*ksm(2,n-2))%mod);
    return 0;
}