这是一道很明显的排列组合题
先看题,他叫我们求所有长度为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;
} 
京公网安备 11010502036488号