题面去内网找~~
这个一看真的不知道是个啥。
观察可知,如果想要处理第i位上的元素使之有序,必须要把前i-1位全部变成有序。我们再分开来想,
如果第i位是i,多移动0步,
第i位是1,多移动1步。
第i位是2,多移动2步:把2提前,再把1提前。
第i位是3,多移动4步:把3提前,重复之前两步。
…….
也就是说,最后一位是i,移动2^(i-1)步。
因此,把前i为变成有序,要走(i-1某种情况的步数)+2^(最后一位是啥)。我们合起来考虑,对于前i-1位同一种情况,最后一位多移动的值加和是(2^i-1),而前i-1位共有!(i-1)种情况,所以f[i]=f[i-1]i+(2^i-1) !(i-1)。递推就好了。
说实在,考试时真的没想到,就交上去了一个dfs,可能因为T2耗的时间太长了,心里有点发慌,没有真的静下心去想。考试心态有待提高。
#include<cstdio>
#define ll long long
ll n,i=3,s=1,A=2,p=4,d=1000000007,m=d-2;
int main()
{
scanf("%lld",&n);
for(;i<=n;i++)
s=s*i%d+(p-1)*A%d,A=A*i%d,p=p*2%d;
while(m)
{
if(m&1)s=s*A%d;
A=A*A%d;
m/=2;
}
printf("%lld",s);
}