P8474 「GLR-R3」立春

发布于:2023-01-17 ⋅ 阅读:(413) ⋅ 点赞:(0)

更好的阅读体验

题意:

σ \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 n1 的一个排列 a 1 , a 2 , a 3 , … , a n − 1 a_1 ,a_2,a_3,\dots ,a_{n-1} a1,a2,a3,,an1 插入数字 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=0n12τ(a)+(ni)=i=0n12τ(a)+i=2τ(a)×i=0n12i

接下来求 ∑ σ 2 τ ( σ ) \sum_\sigma 2^{\tau(\sigma)} σ2τ(σ)

δ \delta δ 为为任意一个长度为 n n n 的排列。

σ \sigma σ 为任意一个长度为 n − 1 n-1 n1 的排列。

β \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=0n12i)

因为 ∑ i = 0 n − 1 2 i \sum_{i=0}^{n-1} 2^i i=0n12i 为定值所以将 ∑ i = 0 n − 1 2 i \sum_{i=0}^{n-1} 2^i i=0n12i 移出得:

∑ δ 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=0n12i=σ2τ(σ)×(2n1)

因为 2 n − 1 = ( 2 n − 1 − 1 ) × 2 − 1 2^n-1=(2^{n-1}-1)\times 2-1 2n1=(2n11)×21 ,考虑递推求解。

a n s i ans_i ansi 为长度为 i i i 的值, f i f_i fi 2 i + 1 − 1 2^{i+1}-1 2i+11

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=ansi1×fi1 , fi=fi1×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;
}