题意:
设 σ \sigma σ 为任意一个长度为 n n n 的排列, τ ( σ ) \tau(\sigma) τ(σ) 表示其中的逆序对个数,请求出
∑ σ 2 τ ( σ ) \sum_\sigma 2^{\tau(\sigma)} σ∑2τ(σ)
对 ( 1 0 9 + 7 ) (10^9+7) (109+7) 取模的结果。
思路:
首先,长度为 n + 1 n+1 n+1 的任意排列等于长度为 n n n 的任意排列在任意一个位置插入数字 n + 1 n+1 n+1 。
- 比如 1 , 2 , 3 1,2,3 1,2,3 在任意一个位置插入 4 4 4 变为 1 , 2 , 3 , 4 1 , 2 , 4 , 3 1 , 4 , 2 , 3 4 , 1 , 2 , 3 1,2,3,4 \quad 1,2,4,3 \quad 1,4,2,3 \quad 4,1,2,3 1,2,3,41,2,4,31,4,2,34,1,2,3 四种情况,其他排列同理。
然后考虑向长度为 n − 1 n-1 n−1 的一个排列 a 1 , a 2 , a 3 , … , a n − 1 a_1 ,a_2,a_3,\dots ,a_{n-1} a1,a2,a3,…,an−1 插入数字 n n n 后逆序对个数的变化。
因为数字 n n n 大于排列 a a a 的任意一个数,所以 n n n 只会和在 n n n 后面的数字形成新的逆序对,并且原来的逆序对不变。
设 β \beta β 为排列 a a a 在任意一个位置插入 n n n 后形成的新排列。
有
∑ β 2 τ ( β ) = ∑ i = 0 n − 1 2 τ ( a ) + ( n − i ) = ∑ i = 0 n − 1 2 τ ( a ) + i = 2 τ ( a ) × ∑ i = 0 n − 1 2 i \sum_\beta 2^{\tau(\beta)} = \sum_{i=0}^{n-1} 2^{\tau(a)+(n-i)}=\sum_{i=0}^{n-1} 2^{\tau(a)+i}=2^{\tau(a)} \times \sum_{i=0}^{n-1} 2^i β∑2τ(β)=i=0∑n−12τ(a)+(n−i)=i=0∑n−12τ(a)+i=2τ(a)×i=0∑n−12i
接下来求 ∑ σ 2 τ ( σ ) \sum_\sigma 2^{\tau(\sigma)} ∑σ2τ(σ) 。
设 δ \delta δ 为为任意一个长度为 n n n 的排列。
设 σ \sigma σ 为任意一个长度为 n − 1 n-1 n−1 的排列。
设 β \beta β 为排列 σ \sigma σ 在任意一个位置插入 n n n 后形成的新排列。
所以:
∑ δ 2 τ ( δ ) = ∑ σ ∑ β 2 τ ( β ) = ∑ σ ( 2 τ ( σ ) × ∑ i = 0 n − 1 2 i ) \sum_\delta 2^{\tau(\delta)}=\sum_\sigma \sum_\beta 2^{\tau(\beta)} =\sum_\sigma \Big (2^{\tau(\sigma)} \times \sum_{i=0}^{n-1} 2^i \Big ) δ∑2τ(δ)=σ∑β∑2τ(β)=σ∑(2τ(σ)×i=0∑n−12i)
因为 ∑ i = 0 n − 1 2 i \sum_{i=0}^{n-1} 2^i ∑i=0n−12i 为定值所以将 ∑ i = 0 n − 1 2 i \sum_{i=0}^{n-1} 2^i ∑i=0n−12i 移出得:
∑ δ 2 τ ( δ ) = ∑ σ 2 τ ( σ ) × ∑ i = 0 n − 1 2 i = ∑ σ 2 τ ( σ ) × ( 2 n − 1 ) \sum_\delta 2^{\tau(\delta)}=\sum_\sigma 2^{\tau(\sigma)} \times \sum_{i=0}^{n-1} 2^i=\sum_\sigma 2^{\tau(\sigma)} \times (2^n-1) δ∑2τ(δ)=σ∑2τ(σ)×i=0∑n−12i=σ∑2τ(σ)×(2n−1)
因为 2 n − 1 = ( 2 n − 1 − 1 ) × 2 − 1 2^n-1=(2^{n-1}-1)\times 2-1 2n−1=(2n−1−1)×2−1 ,考虑递推求解。
设 a n s i ans_i ansi 为长度为 i i i 的值, f i f_i fi 为 2 i + 1 − 1 2^{i+1}-1 2i+1−1 。
有 a n s i = a n s i − 1 × f i − 1 , f i = f i − 1 × 2 + 1 ans_i=ans_{i-1} \times f_{i-1}\ , \ f_i=f_{i-1} \times 2 + 1 ansi=ansi−1×fi−1 , fi=fi−1×2+1 。
答案为 a n s n ans_n ansn 。
C o d e Code Code
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int mod=1e9+7;
int f[10000001];
int ans[10000001];
signed main(){
int n;
cin>>n;
ans[1]=1;
ans[2]=3;
f[2]=7;
for(int i=3; i<=n; i++)
{
f[i]=f[i-1]*2+1,f[i]%=mod;
ans[i]=ans[i-1]*(f[i-1])%mod;
}
cout<<ans[n]<<endl;
return 0;
}