题目链接
思路:
有n个地方可以放数字, 我们考虑在n个位置中取两个位置i, j(i < j) 令 a[i] = 1, a[j] = 0, 形成全部逆序对,
然后其他位置任意放置, 计算每个逆序对在每个字符串中的贡献
于是得到总的方案是
a
n
s
=
2
n
−
2
∗
(
n
2
)
=
2
n
−
3
∗
n
∗
(
n
+
1
)
ans = 2^{n-2}* (\frac {n}{2})=2^{n-3}*n*(n+1)
ans=2n−2∗(2n)=2n−3∗n∗(n+1), 证明上面的猜想是正确的
对了, 记得用快速乘!
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#define int long long
using namespace std;
const int N = 100010,mod = 1e9+7;
int qmi(int a,int b)
{
int res=1;
while(b)
{
if(b&1)res=res*a%mod;
a=a*a%mod;
b>>=1;
}
return res%mod;
}
signed main()
{
int n;
cin>>n;
if(n==1)cout<<0<<endl;
else if(n==2)cout<<1<<endl;
else cout<<((n%mod)*((n-1)%mod)%mod*qmi(2,n-3)%mod)%mod<<endl;
}